【发布时间】:2013-04-09 11:29:24
【问题描述】:
我正在编写一个通用软件,它将加载到相同基本硬件的许多不同变体上。它们都具有相同的处理器,但具有不同的外围设备和它们自己需要执行的功能。软件将通过读取硬件开关值来知道它应该运行哪个变体。
简而言之,这是我当前的实现:
class MyBase
{
public:
MyBase() { }
virtual run() = 0;
}
class VariantA : public MyBase
{
public:
VariantA () { }
virtual run()
{
// Run code specific to hardware Variant-A
}
}
class VariantB : public MyBase
{
public:
VariantB () { }
virtual run()
{
// Run code specific to hardware Variant-B
}
}
void main()
{
MyBase* variant;
uint_8 switchValue = readSwitchValue();
switch(switchValue)
{
case 0:
variant = new VariantA();
break;
case 1:
variant = new VariantB();
break;
}
variant->run();
}
现在这工作得很好。我读取了硬件值并使用 switch 语句创建了新的相应类。
问题是我必须处理很多变体。目前大约有 15 个,有可能在不久的将来再增加 20-30 个。我真的开始鄙视运行数百行的 switch 语句,所以我真的在寻找更好的方法来做到这一点,可能是通过模板。
我希望能够使用我的硬件值来查找类型并使用该类型来创建我的新对象。理想情况下,当我添加一个新变体时,我会创建新类,将该类类型添加到我的查找表中,并使用它匹配的硬件值,这样就可以了。
这可能吗?这里有什么好的解决方案?
【问题讨论】:
-
就个人而言,我认为创建适当类的“switch/case”块可能是最佳解决方案。只需将您的 case 语句放在返回对特定类的引用的静态“工厂”方法中。恕我直言......这是一个很好的例子:stackoverflow.com/questions/7468104/…
-
硬件只能在运行时知道吗?
-
看看这个特定的answer,它描述了一种通过注册构造函数来构建对象工厂的方法。可能值得查找帖子中提到的原始想法。
-
另一个有趣的(和相关的)概念:依赖注入。
-
@Kerrek,是的,硬件只能在运行时知道。
标签: c++ templates design-patterns inheritance