界面中不同参数的策略模式(C#)

use*_*757 7 c# inheritance abstract-class design-patterns strategy-pattern

我基本上试图实现一个策略模式,但我想将不同的参数传递给"接口"实现(继承自同一个对象)并且不知道这是否可行.也许我选择了错误的模式,我得到类似的错误

'StrategyA'没有实现继承的抽象成员'void 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);
 }

}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 14

听起来你实际上是在尝试重新构建访问者模式,而不是仅仅按照预期的方式使用策略模式.

此外,由于您正在使用C#,我建议您阅读Judith Bishop的题为" 在C#3.0中实现的设计模式的效率 "的论文.这详细介绍了访问者模式的多种方法,并提供了一些有趣且相关的有用的想法.


Dzm*_*uba 7

在C#方法中,签名包括其名称,类型参数列表和形式参数列表.在上面的代码中,"覆盖"具有与虚拟方法不同的签名,因此不允许使用.

策略模式背后的核心思想是定义一组可互换的算法,其中隐藏着细节.但是,如果你的策略在他们可以接受的输入中有所不同(按类型),则它们不再可以互换.所以这似乎是在这种情况下使用的错误模式.


Огњ*_*јић 5

您可能需要考虑这篇文章:http : //hillside.net/plop/2010/papers/sobajic.pdf 该模式称为“参数化策略模式”,应该符合您的需要。基本上,它建立在策略模式之上,并允许策略(不同的算法)具有不同的参数。参数被封装在特殊的类中,即参数类。每个策略(即算法)都需要实现 GetParameters() 方法,该方法将特定算法的参数实例列表发回。