делегирование между классами - лучшая практика - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть компонент C #, который имеет класс, как показано ниже:

    namespace SharedComponent{
       class TestResult {
           //several members
       }
    }

В другом существующем приложении C # я ссылаюсь на этот компонент, и мне нужно создать экземпляр этого же класса, но с дополнительным идентификатором, как показано ниже.

    namespace ClientApplication {
      class TestResult 
      { 
             //exact same members as above including methods
             //actually the shared component class was created by gleaming 
             //that from this application!
             int PersonID; //additional identifier
                  //not suitable to have in the shared component
      }
  }

В клиентском приложении есть несколько методов, которые полагаются на дополнительный идентификатор. Поэтому для меня очень заманчиво эмулировать конструктор копирования, создать этот объект и заполнить дополнительный параметр. Таким образом, я могу использовать существующие функции такими, какие они есть, с минимальными изменениями в классе.

Другим способом может быть добавление остальных деталей в качестве ссылки на реализацию на стороне клиента.

 namespace ClientApplication {
     class TestResult {
      SharedComponent.TestResult trshared = new SharedComponent.TestResult()
       //but this warrants I have my class methods to delegate 
       //to the sharedcomponent throughout ; example below

      internal bool IsFollowUp(ClientApplication.TestResult prevTest)
      {
        //a similar method is being used
                //where a function takes the class object as parameter
                trshared.IsFollowUp(prevTest.trshared);
      }

      int PersonID; //additional identifier

   }
}

Какой вариант лучше? Какова лучшая практика в этом отношении?

Среда: VS2008, C #, WinXP / Win7

1 Ответ

2 голосов
/ 20 декабря 2011

Мне кажется, что ваше ClientApplication.TestResult "является" SharedComponent.TestResult.Предполагая, что SharedComponent.TestResult не запечатан, вы можете расширять этот класс.Таким образом, вам не нужно копировать код вставки.Если вы также можете изменить SharedComponent.TestResult, вы можете объявить методы виртуальными и переопределить их поведение в ClientApplication.TestResult.

class TestResult : SharedComponent.TestResult
{
    int PersonId { get; set; }

    override bool IsFollowUp(ClientApplication.TestResult prevTest)
    {
          // Your own implementation or trivial (base.IsFollowUp(ClientApplication.TestResult.prevTest.trShared)
    }
}

Если вы не можете изменить метод на виртуальныйSharedComponent.TestResult, тогда вы можете использовать ключевое слово «new» в производном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...