0

ユーザー入力に応じて 3 つのメソッドのいずれかを呼び出すことができるオブジェクトを作成しようとしています。DoShapeそれらを、、、、DoColorと呼びましょうDoPowerTool。これらのメソッドは、それぞれ基本クラスとインターフェイスの一部として存在します。

Public Class PowerTool
{
...

  public virtual void DoPowerTool()
  {
  ...
  }

}

Public Interface Shape
{
  void DoShape(PowerTool p);
}

Public Interface Color
{
  void DoColor(PowerTool p);
}

PowerToolDoShapeDoColor必要なため、直観的には、これらのメソッドを PowerTool インスタンス自体に組み込むことになります。

残念ながら、PowerTool クラスで Shape と Color を直接実装することはできません。実行時まで、それが赤の四角形のジャッカーマーなのか、緑の卵型のジャッカマーなのかがわからないからです。

私は C# のデリゲートに手を出しましたが、この場合に役立つ可能性があると感じていますが、この正確なシナリオでそれらを実装する方法を知るのに十分な知識がなく、それらが正しいかどうかはわかりません私が探しているモジュラー動作を私に与えるための選択。(この点に関しては、オブジェクトの関数を単純に上書きできる Javascript に甘んじているかもしれません)。

続行する方法についての考えや提案はありますか? おそらく、私が見落としている非常に単純な解決策があるように感じます。

4

2 に答える 2

1

あなたが話していることを行うための比較的簡単な方法(私が知ることができることから)は、単に3つのインターフェースを持つことです:

public interface IPowerTool : IShape, IColor
{
    void Execute();
}

したがって、次のように簡単に定義できます。

public RedSquareJackhammer : IPowerTool
{
   void DoShape() {}
   void DoColor() {}
   void Execute() {}
}

別のオプションは、これを行うことです:

public PowerTool
{
     IColor color;
     IShape shape;

     public PowerTool(IColor c, IShape s) {
         color = c; share = s;
     }

     void Execute()  {
         color.DoColor();
         shape.DoShape();
     }
}

次に、次のように呼び出します。

// JackHammer is derived from PowerTool, Red from IColor, Square from IShape
var redSquareJackhammer = new JackHammer(new Red(), new Square());

などなど、この猫の皮を剥ぐ方法はたくさんあります。

于 2014-07-01T23:12:56.900 に答える
0

あなたが言及しているのはMixinの概念だと思います。

ここで、インターフェイスの 1 つまたは複数の実装が定義され、その実装が具体的な型に再利用されます。

残念ながら、フレームワークは多重継承を使用できないように設計されているため、これは .NET では実際には不可能です。ただし、拡張メソッドを使用するか、依存性注入と戦略パターンを使用して、求めている動作を複製できる場合があります。

パターンについてさらに質問がある場合、またはより適切な例が必要な場合は、達成しようとしていることをより詳細にお知らせください。できる限りお手伝いします。

あなたが説明していることを理解できれば、次の戦略パターンが役立つ可能性があります。

internal interface IPowerToolStrategy
{
    void Execute(PowerTool powerTool);
}

public class RedSquareJackhammer : IShape
{
    private readonly IPowerToolStrategy _strategy;
    internal RedSquareJackhammer(IPowerToolStrategy strategy)
    {
        _strategy = strategy;
    }

    public void DoShape(PowerTool powerTool)
    {
        _strategy.Execute(powerTool);
    }
}
于 2014-07-01T21:31:08.427 に答える