作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个设计问题。
我有一个带有接口(interface) A(抽象接口(interface))的多态结构和一个在类 W 中实现的工作流,它在不知道派生类的情况下使用接口(interface) A。这是在 DLL1 中实现的,我有一个能够返回 A* 的工厂接口(interface) F。在 DLL2 中,我有 A 的具体实现,可以是 A1、A2 等,还有一个能够创建 A1 和 A2 实例的工厂实现 F1。
我的工厂接口(interface)是这样的。
enum ObjectType{typeA1, typeA2};
class F
{
public:
A* create(enum ObjectType) = 0;
}
一些知道 DLL1 和 DLL2 的客户端类会给我具体的对象类型。
但这很丑陋,因为在编写 DLL1 时我必须预先知 Prop 体类的可能类型。这几乎违背了我多态设计的目的。我不想这样做。
我能想到的替代选项是使用字符串,而不是枚举。但是,我喜欢避免使用字符串,因为它们不是类型安全的并且容易出错。我希望我有机会通过继承来扩展枚举,就像类一样。
我的问题:
有更好的出路吗?在 C++11 中可以扩展枚举吗? (虽然我现在没有)
最佳答案
您可以修改您的抽象以允许界面用户 A
还提供创建它的特定工厂。 (而不是提供 enum
)。
// In DLL1
class AbstractF {
public:
virtual A * create () = 0;
};
template <typename ConcreteA>
class ConcreteF : public AbstractF {
public:
A * create () { return new ConcreteA; }
};
现在,每个 ConcreteF<>
对于需要创建 A
的正确具体实例的框架部分,需要将其传递到 DLL1 的代码中.因此,框架用户必须通知框架 A1
中的哪一个 |或 A2
不通过传入 ObjectType
来创建, 但通过传递正确的 ConcreteF
(即 ConcreteF<A1>
或 ConcreteF<A2>
)。
关于c++ - 扩展枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348413/
我是一名优秀的程序员,十分优秀!