3

我有一个设计问题。

我有一个多态结构,带有一个接口 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 中可以扩展枚举吗?(虽然我现在没有)

4

2 回答 2

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<>对于需要创建正确的A. 因此,框架用户必须通过传入正确的(即或)而不是通过传递来通知框架创建A1或创建哪个。A2ObjectTypeConcreteFConcreteF<A1>ConcreteF<A2>

于 2012-07-05T16:48:06.547 回答
0

如果让 DDL2 有一个“string-to-int”接口,你可以用它来翻译一次字符串,然后使用该 id 作为实际工厂的参数?如果 DLL2 无法识别该字符串,则创建过程可能会在此处失败。

于 2012-07-05T16:21:35.573 回答