【问题标题】:Extending the enumerations扩展枚举
【发布时间】:2012-07-05 16:13:39
【问题描述】:

我有一个设计问题。

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

【问题讨论】:

  • 枚举或字符串的替代方法是UUID
  • 在 C++ 中枚举不能被继承。在大多数允许这样做的语言中,继承的工作方向与大多数人的想法相反。它不扩展枚举,它收缩它们。奇怪但真实,并且有很好的理由。所以你的想法不可能奏效。

标签: c++ enums factory


【解决方案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; }
};

现在,对于需要创建A 的正确具体实例的框架部分,需要将每个ConcreteF&lt;&gt; 传递到DLL1 的代码中。因此,框架用户必须通过传入正确的ConcreteF(即ConcreteF&lt;A1&gt;ConcreteF&lt;A2&gt;)而不是通过传递ObjectType 来通知框架创建A1A2。 /p>

【讨论】:

  • 注意:这是一个依赖注入。
  • @MatthieuM.:谢谢,我不知道有这个名字。
  • 是的,这看起来更好...我没有考虑模板的可能性...谢谢...
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多