我遇到了设计问题。
我有一个带有接口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中扩展枚举是否可行? (不过我现在没有)
答案 0 :(得分:1)
您可以修改抽象以允许接口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<>
都需要传递给DLL1的代码,以用于需要创建A
的正确具体实例的框架的那些部分。因此,框架用户必须通过传递A1
,但通过传入正确的A2
(即{{} ObjectType
,来通知框架ConcreteF
或ConcreteF<A1>
。 1}}或ConcreteF<A2>
)。
答案 1 :(得分:0)
让DDL2有一个“string-to-int”接口,你用它来翻译一次字符串,然后用那个id作为实际工厂的参数呢?如果DLL2无法识别字符串,则创建过程可能会在那里失败。