Стратегическая модель с Различными параметрами в интерфейсе (C#)

Я в основном пытаюсь реализовать Стратегическую модель, но я хочу передать различные параметры реализации "интерфейсов" (которые наследовались тому же объекту), и не знайте, возможно ли это. Возможно, я выбираю неправильный шаблон, я получаю ошибку, подобную

'StrategyA' не реализует наследованного абстрактного участника, 'освобождают DoSomething (BaseObject)'

с кодом ниже:

abstract class Strategy
{
 public abstract void DoSomething(BaseObject object);
}

class StrategyA : Strategy
{
 public override void DoSomething(ObjectA objectA)
 {
  // . . .
 }
}

class StrategyB : Strategy
{
 public override void DoSomething(ObjectB objectB)
 {
  // . . .
 }
}

abstract class BaseObject
{
}

class ObjectA : BaseObject
{
 // add to BaseObject
}

class ObjectB : BaseObject
{
 // add to BaseObject
}

class Context
{
   private Strategy _strategy;

 // Constructor
 public Context(Strategy strategy)
 {
  this._strategy = strategy;
 }

    // i may lose addtions to BaseObject doing this "downcasting" anyways?
 public void ContextInterface(BaseObject obj) 
 {
  _strategy.DoSomething(obj);
 }

}
7
задан user210757 24 December 2009 в 17:29
поделиться

4 ответа

Похоже, что Вы на самом деле пытаетесь заново изобрести паттерн посетителей Visitor pattern, вместо того, чтобы просто использовать паттерн Strategy так, как он был задуман. Также, поскольку вы используете C#, я бы порекомендовал прочитать статью Джудит Бишоп под названием "Об эффективности шаблонов дизайна, реализованных на C# 3.0". В ней подробно рассматриваются различные подходы к шаблону посетителя, а также содержатся некоторые интересные, связанные с ним полезные идеи.

.
14
ответ дан 6 December 2019 в 06:24
поделиться

В C# сигнатура метода включает его имя, список параметров типа и формальный список параметров. В приведенном выше коде "переопределения" имеют сигнатуры, отличные от виртуального метода, и поэтому не допускаются.

Основной идеей Strategy Pattern является определение набора взаимозаменяемых алгоритмов с деталями, скрытыми внутри. Но если ваши стратегии отличаются (по типу) тем, что они могут принять за вход, то они больше не являются взаимозаменяемыми. Поэтому кажется, что это неправильный паттерн для использования в данной ситуации

.
7
ответ дан 6 December 2019 в 06:24
поделиться

Вы можете создать класс параметров следующим образом:

public class Parameters
{
  public ObjectA {get; set;}
  public ObjectB {get; set;}
}

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

class StrategyA : Strategy
{
 public override void DoSomething(Parameters parameters)
 {
      //  Now use ObjectA
      if(parameters.ObjectA.SomeProperty == true)
      { ... }
 }
}

Таким образом, вы можете добавить дополнительные параметры, если ваши требования изменятся в будущем. Другой альтернативой является использование Dictionary , где вы можете сделать:

class StrategyA : Strategy
{
     public override void DoSomething(Dictionary<string, object>parameters)
     {
          //  Now use ObjectA
          var someProperty = (bool)parameters["SomeProperty"];
          if() ...
     }
}
1
ответ дан 6 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: