Как справиться с разницей в унаследованных классах? - PullRequest
1 голос
/ 29 марта 2012

Я должен выполнить несколько действий. Каждый из них имеет несколько общих элементов, поэтому они должны наследоваться от одного класса. Допустим, они выполняют некоторые веб-действия, поэтому базовый класс -

public class WebAction
{
    private ServerData _serverData;
    public WebAction(ServerData serverData)
    {
        _serverData = serverData;
    }
}

Кроме того, каждое из этих действий необходимо выполнить, поэтому в базовом классе у меня также должен быть какой-то Execute() метод. Проблема в том, что каждый из этих объектов делает немного разные вещи, поэтому он должен принимать разные параметры. Мой вопрос - ведьма способ лучше всего достичь этого?

Сначала я думал о каком-то объекте конфигурации, например, g. Execute(IWebActionConfig config). В этом случае я могу использовать объект как:

 LoginWebAction loginWebAction = LoginWebAction(staticServerConfig);
 LoginWebActionConfig = new LoginWebActionConfig { someData = "foo" };
 loginWebAction.Execute(loginWebActionConfig);

Но есть ли смысл создавать дополнительное дерево объектов? Может быть лучше будет настроить каждый дочерний элемент WebAction по свойствам?

LoginWebAction loginWebAction = LoginWebAction(staticServerConfig);
loginWebAction.someData = "foo";
// Execute will throw exception when someData not set
loginWebAction.Execute();

С этим (если есть) способом лучше?

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Поскольку каждое действие принимает разные параметры, вы на самом деле не сможете использовать полиморфизм для их вызова.Другими словами, метод, который вызывает Execute для вашего класса, должен знать точный тип класса, для которого он будет вызывать Execute.

Итак, я хотел бы задать вопрос, действительно ли использование наследования является правильным решениемздесь.

Вы заявляете, что используете наследование, потому что у каждого класса есть некоторый общий код.Обычно это недостаточно веская причина для использования наследования.Я бы рассматривал это как анти-шаблон.

Проблема использования наследования заключается в том, что вы тесно связываете базовый класс с производным классом.Это может вызвать проблемы с модульным тестированием и будущим обслуживанием.

Я бы посоветовал создать отдельный класс, который содержит общие функциональные возможности.Затем ваши классы Action, которые содержат этот класс в качестве члена и вызывают при необходимости.Это позволит вам смоделировать этот базовый класс для целей тестирования.Тогда у каждого из этих классов может быть свой метод Execute, каждый с требуемыми параметрами.

1 голос
/ 29 марта 2012

Я думаю, вы могли бы использовать Command Pattern здесь. Вы можете создавать различные команды (одна команда для каждого веб-действия), которые инкапсулируют ваше «Действие», и у каждой из них будут все необходимые параметры.

Обработчик команды будет содержать «Логику» для выполнения этой команды.

больше информации о шаблоне команд на:

http://www.codeguru.com/csharp/.net/net_general/patterns/article.php/c15663/Implement-a-Command-Pattern-Using-C.htm

http://danielshitrit.blogspot.co.uk/2011/11/best-practices-command-pattern-in-c.html

0 голосов
/ 29 марта 2012

Можно сделать в более стиле ООП. посмотрите на паттерн NVI

public class WebAction
{
  private ServerData _serverData;
  public WebAction(ServerData serverData)
  {
    _serverData = serverData;
  }
  public virtual ExecuteAction{};
  public Execute()
  {
     ExecuteAction();
     //to do the rest of base code 

  }
}
public class WebActionDerived1: WebAction
{
   WebActionDerived1(ServerData serverData, object arg1/*any unique param*/)
   :base(serverData)
   {
      _my_arg1 = arg1;
   }
   public override ExecuteAction
   {
    //call any procedure with your _my_arg1;
   }
}
public class WebActionDerived2: WebAction
{
   WebActionDerived1(ServerData serverData, string arg1,
   string arg2/*otherunique param*/)
   :base(serverData)
   {
      _my_arg1 = arg1;
      _my_arg2 = arg2;
   }
   public override ExecuteAction
   {
    //call any procedure with your _my_arg1, and _my_arg2;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...