2012-07-05 125 views
3

我有一个设计问题。扩展枚举

我有一个接口A(抽象的)多态结构和类W实现的工作流使用接口A而不知道派生类。这是在DLL1中实现的,并且我有一个能够返回A *的工厂接口F. 在DLL2中,我有A的具体实现,可以是A1,A2等,也可以是工厂实现的F1,可以创建A1和A2实例。

我拥有的工厂界面就是这样的。

enum ObjectType{typeA1, typeA2}; 

class F 
{ 
    public: 
    A* create(enum ObjectType) = 0; 
} 

某些知道DLL1和DLL2的客户端类将为我提供具体的对象类型。

但是这很丑陋,因为当我编写我的DLL1时,我将不得不先知道具体类的可能类型。这几乎打破了我多形设计的目的。我不想这样做。

我能想到的另一种选择是使用字符串,而不是枚举。但是,我喜欢避免字符串,因为它们不是类型安全的,并且容易出错。我希望我有机会通过继承扩展枚举,就像类一样。

我的问题:

有没有更好的出路? 在C++ 11中是否可以扩展枚举? (但我现在没有它)

+0

enum或字符串的替代方法是[UUID](http://en.wikipedia.org/wiki/Uuid)。 – 2012-07-05 16:17:48

+0

在C++中,枚举不能被继承。在大多数允许这样做的语言中,继承与大多数人的想法相反。它不*扩展*枚举,它*合同*他们。奇怪而真实,而且有很好的理由。所以你的想法不可能奏效。 – 2012-07-05 18:00:37

回答

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权具体实例的框架的那些部分。因此,框架用户必须通知框架A1A2不是通过传递ObjectType而是通过传入正确的ConcreteF(即ConcreteF<A1>ConcreteF<A2>)来创建。

+0

注意:这是一个依赖注入。 – 2012-07-05 18:22:54

+0

@MatthieuM .:谢谢,我不知道有这个名字。 – jxh 2012-07-05 19:18:53

+0

是的,这看起来更好......我没有考虑模板的可能性......谢谢...... – PermanentGuest 2012-07-06 08:44:58

0

让DDL2有一个“字符串到int”的接口用来翻译字符串一次,然后使用该id作为实际工厂的参数呢?如果DLL2不能识别字符串,那么创建过程可能会在那里失败。