【发布时间】:2012-07-05 16:13:39
【问题描述】:
我有一个设计问题。
我有一个多态结构,它有一个接口 A(抽象的)和一个在类 W 中实现的工作流,它使用接口 A 而不知道派生类。这是在 DLL1 中实现的,我有一个能够返回 A* 的工厂接口 F。 在 DLL2 中,我有 A 的具体实现,可以是 A1、A2 等,以及能够创建 A1 和 A2 实例的工厂实现 F1。
我的工厂界面是这样的。
enum ObjectType{typeA1, typeA2};
class F
{
public:
A* create(enum ObjectType) = 0;
}
一些同时知道 DLL1 和 DLL2 的客户端类会给我具体的对象类型。
但这很难看,因为当我编写 DLL1 时,我必须预先知道具体类的可能类型。这几乎违背了我多态设计的目的。我不想这样做。
我能想到的另一种选择是使用字符串,而不是枚举。但是,我喜欢避免使用字符串,因为它们不是类型安全的并且容易出错。我希望我有机会通过继承来扩展枚举,就像类一样。
我的问题:
有没有更好的出路? 在 C++11 中可以扩展枚举吗? (不过我现在没有)
【问题讨论】:
-
枚举或字符串的替代方法是UUID。
-
在 C++ 中枚举不能被继承。在大多数允许这样做的语言中,继承的工作方向与大多数人的想法相反。它不扩展枚举,它收缩它们。奇怪但真实,并且有很好的理由。所以你的想法不可能奏效。