2011-08-10 136 views
0

我遇到了麻煩,試圖設計類。 我有摘要Chip類,STM8類,它擴展了Chip並實現IConfigurable(它具有Configure方法)。C#策略模式設計問題

我希望每個實現IConfigurable的類都有一個方法Configure,它使用一個參數來決定使用策略模式(方法)來配置什麼。

的僞代碼:

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

配置的東西在每一類不同。例如,STM8可以有GPIO和定時器,並且STM8L只能有GPIO。然後,創建每個子類的方式應該是愚蠢的,所以我想迫使人們在他們的類中聲明自己的enum

最後,用一對enum/delegate初始化字典是否是一個好主意,以顯示可以配置的內容? this.periphials用於上面的僞代碼?

+0

你的僞代碼是什麼意思?另外我在這裏看不到戰略模式。 – BrokenGlass

+0

你嘗試過什麼方法?這似乎更像是一個哲學問題。 –

+0

這是一種使用periphial枚舉調用某些配置器,然後執行其委託(指向同一對象內的成員方法的指針)的方法。我在這裏有不止一個問題,對不起。 – 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

嘗試使用泛型,如果你沒有太多的外圍元素。 所以做一個類型,爲每個peripherial TPeripherial1,TPeripherial2等 然後做一個通用接口

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

然後在你的類實現儘可能多的類型配置接口,它支持。 這些所有的方法都可以被路由到一個私有的方法,這將不會是類型和白癡的安全。

0

我不認爲你可以做你對可能的外圍設備枚舉的建議。

我認爲你應該做的是檢查提供的Peripheral的類型,它提供給Configure()並返回一個自定義的異常,如果該類型不是支持者。

所以對於STM8L,你會怎麼做:

public void Configure(Peripheral p) 
{ 

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

} 

如果你能有一些可爲Chip的子類枚舉,這將是完全一樣的,如果你能定義PorpertiesmyChip.GPIO。使用類繼承隱藏對象really在編譯時的什麼...