2011-08-10 11 views
0

私はクラスを設計しようとするとトラブルが発生しています。 私は抽象的なChipクラス、クラスを持ち、Chipを拡張し、IConfigurable(これはConfigureメソッドを実装しています)クラスを実装しています。C#戦略パターン設計の問題

IConfigurableを実装する各クラスは、戦略パターン(メソッド)を使用して、何を構成するかを決定する1つの引数を取るメソッドConfigureを持つと考えています。

擬コード:設定するには、

public void Configure(Periphial p) 
{ 
    this.periphials[p](); 
} 

もちろん、物事は各クラスで異なります。たとえば、STM8はGPIOとタイマーを持ち、STM8LはGPIOしか持つことができません。次に、各サブクラスが作成される方法は、愚かなものでなければなりません。そのため、人々はクラス内に自分自身でenumを宣言しなければなりません。

最後に、構成可能なものを表示するために、1組のenum/delegateで辞書を初期化することをお勧めしますか? this.periphials上記の擬似コードで使用されていますか?

+0

擬似コードは何を意味しますか?また、私はここで戦略パターンを見ていない。 – BrokenGlass

+0

あなたはどのようなアプローチを試みましたか?これは哲学的な問題のように思える。 –

+0

これは、periphial enumを使用して特定のコンフィギュレータを呼び出して、そのデリゲート(同じオブジェクト内のメンバメソッドへのポインタ)を実行する方法です。ここには複数の質問があります。申し訳ありません。 – aambrozkiewicz

答えて

3

あなたのPeriphial(代わりにPeripheralという名前を付ける必要がありますか?)にConfigureメソッドがあったらどうなりますか?

foreach (Peripheral p in peripherals) { 
    p.Configure(); 
} 

、または周辺機器がコンフィグレータを返した場合は、

foreach (Peripheral p in peripherals) { 
    IConfigurator configurator = p.GetConfigurator(); 
    configurator.Configure(); 
} 
+0

+1のスペルを修正します。 "Periphial"は私を悩ませる。 – drharris

+0

ひどいです、+1 :) – aambrozkiewicz

0

周縁部があまりありません。 だから、それがサポートしているとして、あなたのクラスに限り入力された設定可能なインタフェースを実装し、汎用インタフェース

interface IConfigurable<T> : where T TPeripherialBase 
{ 
    void Configure<T>() 
} 

を作るすべてのperipherial TPeripherial1、TPeripherial2など のためのタイプを作ります。 これらのすべてのメソッドは、型や馬鹿にならないプライベートメソッドにルーティングできます。

0

可能性のある周辺機器の列挙を提案することはできません。

Configure()に提供されているPeripheralのタイプを確認し、そのタイプがサポーターでない場合のカスタム例外を返します。

だからSTM8Lのために、あなたはどうなる:あなたは myChip.GPIOような Porpertiesを定義することができているかのよう

public void Configure(Peripheral p) 
{ 

    if (p is GPIO) ConfigureGPIO() 
    else throw new NotAvailablePeripheralException(p); 

} 

あなたがChipのサブクラスのために利用できるいくつか列挙を持っていることができたなら、それはまったく同じになります。クラスの継承は、オブジェクトreallyがコンパイル時に隠しているものを隠します...

関連する問題