簡體   English   中英

接口(C#)中具有不同參數的策略模式

[英]Strategy Pattern with Different parameters in interface (C#)

我基本上是在嘗試實現策略模式,但是我想將不同的參數傳遞給“接口”實現(從同一對象繼承),並且不知道這樣做是否可行。 也許我選擇了錯誤的模式,但出現類似的錯誤

'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);
 }

}

聽起來您實際上是在嘗試重塑Visitor模式 ,而不是僅按預期方式使用Strategy模式。

另外,由於您使用的是C#,因此建議您閱讀Judith Bishop的論文,題為《 在C#3.0中實現的設計模式的效率》 這詳細介紹了訪問者模式的多種方法,並提供了一些有趣且相關的有用想法。

在C#方法中,簽名包括其名稱,類型參數列表和形式參數列表。 在上面的代碼中,“覆蓋”具有與虛擬方法不同的簽名,因此是不允許的。

策略模式背后的核心思想是定義一組可互換的算法,其中隱藏了細節。 但是,如果您的策略在接受類型上有所不同(根據類型),它們將不再可以互換。 因此,在這種情況下似乎使用了錯誤的模式。

您可能需要考慮一下這篇文章: http : //hillside.net/plop/2010/papers/sobajic.pdf該模式稱為“參數化策略模式”,應符合您的需求。 基本上,它建立在策略模式的基礎上,並允許策略(不同的算法)具有不同的參數。 參數封裝在特殊的類中,即參數類。 每個策略(即算法)都需要實現GetParameters()方法,該方法會發回特定算法的參數實例列表。

策略模式旨在為相同類型的輸入對象提供不同的行為。

您實際上想做的是與上下文相關的,並且我不確定可以從發布的代碼中看到它。

您可以創建一個Parameters類,如下所示:

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<string, object> ,您可以在其中執行以下操作:

class StrategyA : Strategy
{
     public override void DoSomething(Dictionary<string, object>parameters)
     {
          //  Now use ObjectA
          var someProperty = (bool)parameters["SomeProperty"];
          if() ...
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM