0

タイトルがあまり明確でないことは承知しています。

Plot というクラスがあり、Plot を継承するクラスが 2 つあります。

class Plot
{
}

class DynamicPlot : public Plot
{
}

class StaticPlot : public Plot
{
}

そして、PhasePlot、RPMPlot と呼ばれるいくつかのクラスを追加したいと思います。また、これらのクラスを動的または静的にすることもできます。

それで、最初に頭に浮かぶのは次のことです。

class DynamicPhasePlot : public DynamicPlot 
{
}

class DynamicRPMPlot : public DynamicPlot 
{
}

class StaticPhasePlot : public StaticPlot 
{
}

class StaticRPMPlot : public StaticPlot 
{
}

これはあまり良い解決策ではないようです。デコレータ パターンを検索しましたが、私のニーズに合わないと思います。しかし、よくわかりません。

4

2 に答える 2

1

プロットのユースケース(および動的/静的のコンテキストまたは懸念)を提供していないのは残念です。ただし、ここではInterfaceDecoratorまたはComposition over Inheritance (strategy pattern)が適用されます。

インターフェース:

interface IPlot //this is optional
interface IDynamicPlot : IPlot
interface IStaticPlot : IPlot
// depending on context, the IPhasePlot can be defined as 
// IDynamicPhasePlot inherited from IDynamicPlot. Same as for static.
interface IPhasePlot : IPlot
interface IRPMPlot : IPlot
class Plot : IPlot
class DynamicPlot : IDynamicPlot
//etc

戦略パターン:

導出されたプロットがDynamicまたはに依存している場合は、これを使用しStaticます。ファサードクラスとして機能します。

class DynamicRPMPlot{
    IDynamicPlot dynamicPlot = new DynamicPlot(); //you can do constructor injection here
    IRPMPlot rPMPlot = new RPMPlot(); //you can do constructor injection here

    public void DoSomething(){
        dynamicPlot.DoSomething();
        // you can also migrate the implementation of RPMPlot to here,
        //if it has different cases for dynamic or static
        rPMPlot.DoSomething();
    }
}

デコレータ パターン:

RPMdynamicが分離されている場合は、これを使用します。

class RPMPlot : IRPMPlot {
    RPMPlot(IPlot decorated){
        // can place null guard here
        this.decorated = decorated;
    }
    IPlot decorated;

    public void DoSomething(){
        decorated.DoSomething(); //you can change the sequence
        //implementation of rpmplot
    }
}

void ConsumePlot(){
    IPlot plot = new RPMPlot(new DynamicPlot());
    plot.DoSomething();
}
于 2013-08-05T16:31:48.283 に答える
0

動的または静的は、プロットの動作です。したがって、DynamicPlot は動的な動作を持つ Plot であり、StaticPlot は静的な動作を持つ Plot です。DynamicPlot や StaticPlot などの新しいクラスを作成する代わりに、StrategyPattern を使用してこの動作を動的に設定できます。

public enum PlotBehavior
{
   None,
   Dynamic,
   Static
}

public class Plot
{
   private PlotBehavior m_Behavior;
   public Plot()
   {
   }
   public SetBehavior(PlotBehavior ieBehavior)
   {
     this.m_Behavior = ieBhavior;
   }
}

これで、Plot クラスをインスタンス化して、動的プロットまたは静的プロットの両方として使用できるようになりました。これで、以下のように、これをより具体的なクラスにサブクラス化できます。

public PhasePlot: public Plot
{
}

public RPMPlot: public Plot
{
}

あなたはアイデアを得る!

于 2013-08-05T14:38:11.587 に答える