我在尝试设计课程时遇到了麻烦。
我有抽象Chip
类,STM8
类,它扩展Chip
并实现IConfigurable
(具有Configure方法)。
我希望每个实现IConfigurable
的类都有一个方法Configure
,它使用一个参数来决定使用策略模式(方法)来配置什么。
Psuedo代码:
public void Configure(Periphial p)
{
this.periphials[p]();
}
当然,配置的内容因每个课程而异。例如,STM8
可以有GPIO和定时器,STM8L
只能有GPIO。然后,创建每个子类的方式应该是愚蠢的,所以我想强迫人们在他们的类中声明自己的enum
。
最后,用一对enum / delegate初始化字典是否是一个好主意,以显示可以配置的内容?上面的伪代码中使用了this.periphials
?
答案 0 :(得分:3)
如果您的Periphial(它应该被命名为Peripheral?)确实有一个Configure方法怎么办?
foreach (Peripheral p in peripherals) {
p.Configure();
}
或者你的外围设备是否返回了配置程序?
foreach (Peripheral p in peripherals) {
IConfigurator configurator = p.GetConfigurator();
configurator.Configure();
}
答案 1 :(得分:0)
如果你没有太多的外围,尝试使用泛型。 因此,为每个外围TPeripherial1,TPeripherial2等制作一个类型。 然后创建一个通用接口
interface IConfigurable<T> : where T TPeripherialBase
{
void Configure<T>()
}
然后在您支持的类上实现尽可能多的类型化可配置接口。 这些所有方法都可以路由到一个私有方法,这种方法不是类型和白痴安全的。
答案 2 :(得分:0)
我认为你不能用你对可能的外围设备的枚举做出你的建议。
我认为你应该做的是检查提供给Peripheral
的{{1}}提供的类型,如果类型不是支持者,则返回自定义异常。
所以对于STM8L,你会这样做:
Configure()
如果您能够为public void Configure(Peripheral p)
{
if (p is GPIO) ConfigureGPIO()
else throw new NotAvailablePeripheralException(p);
}
的子类提供一些枚举,那么就像定义Chip
(例如Porperties
)一样。使用class inheritage会隐藏对象myChip.GPIO
在编译时的内容......