[英]C# Strategy pattern design problem
我在嘗試設計課程時遇到了麻煩。 我有抽象Chip
class, STM8
class 擴展Chip
並實現IConfigurable
(具有配置方法)。
我希望每個實現IConfigurable
的 class 都有一個方法Configure
,它需要一個 arguments 使用策略模式(方法)來決定配置什么。
偽代碼:
public void Configure(Periphial p)
{
this.periphials[p]();
}
當然,每個 class 的配置都不同。 比如STM8
可以有GPIO和Timers, STM8L
只能有GPIO。 然后,每個子類的創建方式應該是愚蠢的,所以我想強迫人們在他們的類中聲明他們自己的enum
。
最后,用一對枚舉/委托來初始化字典以顯示可以配置的內容是一個好主意嗎? 上面的偽代碼中使用了this.periphials
?
如果您的 Periphial(應該改為 Peripheral 嗎?)確實有一個 Configure 方法怎么辦?
foreach (Peripheral p in peripherals) {
p.Configure();
}
或者如果您的外圍設備返回了配置器?
foreach (Peripheral p in peripherals) {
IConfigurator configurator = p.GetConfigurator();
configurator.Configure();
}
如果您沒有太多外圍設備,請嘗試使用 generics。 因此,為每個外設 TPeripherial1、TPeripheral2 等創建一個類型。然后創建一個泛型接口
interface IConfigurable<T> : where T TPeripherialBase
{
void Configure<T>()
}
然后在 class 上實現盡可能多的類型化可配置接口,因為它支持。 所有這些方法都可以路由到一個私有方法,該方法不是類型和白痴安全的。
我不認為你可以對可能的外圍設備的枚舉做你建議的事情。
我認為你應該做的是檢查提供給Configure()
的Peripheral
的類型,如果該類型不是支持者,則返回一個自定義異常。
所以對於STM8L,你會這樣做:
public void Configure(Peripheral p)
{
if (p is GPIO) ConfigureGPIO()
else throw new NotAvailablePeripheralException(p);
}
如果您能夠為Chip
的子類提供一些可用的枚舉,則與您可以定義諸如myChip.GPIO
之類的Porperties
完全相同。 使用 class 繼承隱藏了 object 在編譯時的really
含義......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.