扩展枚举

时间:2012-07-05 16:13:40

标签: c++ enums factory

我遇到了设计问题。

我有一个带有接口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中扩展枚举是否可行? (不过我现在没有)

2 个答案:

答案 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,来通知框架ConcreteFConcreteF<A1>。 1}}或ConcreteF<A2>)。

答案 1 :(得分:0)

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