c#策略模式设计问题
本文关键字:问题 模式 策略 | 更新日期: 2023-09-27 18:05:03
我在尝试设计类时遇到了麻烦。我有抽象的Chip
类,扩展了Chip
的STM8
类,实现了IConfigurable
类(具有Configure方法)。
我希望每个实现IConfigurable
的类都有一个方法Configure
,它使用一个参数来决定要配置什么,使用策略模式(方法)。
伪代码:
public void Configure(Periphial p)
{
this.periphials[p]();
}
当然,每个类需要配置的东西是不同的。例如,STM8
可以有GPIO和Timers, STM8L
只能有GPIO。然后,每个子类的创建方式应该是愚蠢的,所以我想强迫人们在他们的类中声明他们自己的enum
。
最后,用一对enum/delegate来初始化字典,以显示可能配置的内容,这是否是个好主意?上面伪代码中使用的this.periphials
?
如果您的Periphial(应该将其命名为Peripheral吗?)确实有一个Configure方法呢?
foreach (Peripheral p in peripherals) {
p.Configure();
}
或者如果你的外设返回一个配置器?
foreach (Peripheral p in peripherals) {
IConfigurator configurator = p.GetConfigurator();
configurator.Configure();
}
如果没有太多的外设,请尝试使用泛型。所以为每个外围设置一个类型TPeripherial1, TPeripherial2等等。然后创建一个通用接口
interface IConfigurable<T> : where T TPeripherialBase
{
void Configure<T>()
}
然后在你的类上实现尽可能多的类型可配置接口。所有这些方法都可以路由到一个私有方法,这个私有方法不是类型安全的。
我认为你不能按照你的建议为可能的外设使用枚举。
我认为你应该做的是检查提供给Configure()
的Peripheral
的类型,如果该类型不支持,则返回自定义异常。
对于STM8L,您可以这样做:
public void Configure(Peripheral p)
{
if (p is GPIO) ConfigureGPIO()
else throw new NotAvailablePeripheralException(p);
}
如果您能够为Chip
的子类提供一些枚举,那么它将与您可以将Porperties
定义为myChip.GPIO
完全相同。使用类继承隐藏了对象really
在编译时是什么…