Я в основном пытаюсь реализовать Стратегическую модель, но я хочу передать различные параметры реализации "интерфейсов" (которые наследовались тому же объекту), и не знайте, возможно ли это. Возможно, я выбираю неправильный шаблон, я получаю ошибку, подобную
'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);
}
}
Похоже, что Вы на самом деле пытаетесь заново изобрести паттерн посетителей Visitor pattern, вместо того, чтобы просто использовать паттерн Strategy так, как он был задуман. Также, поскольку вы используете C#, я бы порекомендовал прочитать статью Джудит Бишоп под названием "Об эффективности шаблонов дизайна, реализованных на C# 3.0". В ней подробно рассматриваются различные подходы к шаблону посетителя, а также содержатся некоторые интересные, связанные с ним полезные идеи.
.В C# сигнатура метода включает его имя, список параметров типа и формальный список параметров. В приведенном выше коде "переопределения" имеют сигнатуры, отличные от виртуального метода, и поэтому не допускаются.
Основной идеей Strategy Pattern является определение набора взаимозаменяемых алгоритмов с деталями, скрытыми внутри. Но если ваши стратегии отличаются (по типу) тем, что они могут принять за вход, то они больше не являются взаимозаменяемыми. Поэтому кажется, что это неправильный паттерн для использования в данной ситуации
.Шаблон стратегии предназначен для обеспечения различного поведения на входных объектах одного и того же типа.
То, что вы на самом деле пытаетесь сделать, зависит от контекста, и я не уверен, что это можно увидеть из размещенного кода.
.Вы можете создать класс параметров следующим образом:
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() ...
}
}