【问题标题】:enum class in an Interface classe接口类中的枚举类
【发布时间】:2018-02-09 22:03:00
【问题描述】:

我有一个看起来像这样的接口类

class Module {
public:

    virtual ~Module() = default;

    virtual void inc(CounterType, uint64_t) = 0;

    virtual void dec(CounterType, uint64_t) = 0;
};

这里的 counterType 是一个枚举类(来自 cpp11)。因此,从我的接口类派生的模块应使用其自己的一组枚举类(同样是特定于模块的)

当然编译器不能使用除此处指定的 CounterType 以外的枚举类的不同模块。

我需要重新设计吗?或者在这种情况下正确的设计实践是什么?

【问题讨论】:

  • CounterType 代表什么?
  • 您将如何覆盖具有不同签名的方法?这是没有意义的。而且语言不允许。
  • 我建议考虑使用模板类,但虚拟模板成员函数是非法的......
  • CounterType 将是一个枚举,用于识别不同模块的计数器,例如 CounterMod1Type、CounterMod2Type ... 等。这些模块中的每一个都有一个计数器的变体。
  • 不知道CounterType的类型,你打算如何使用Module接口?

标签: c++ c++11 design-patterns


【解决方案1】:

不同的枚举类将是根本不同的变量类型,因此这在某种意义上违背了虚拟方法的目的,虚拟方法旨在用于签名相同但行为因实例类型而异的情况.

由于与您的不同Modules 关联的枚举不同,这些Modules 的接口也应该不同,因此incdec 不应该是虚拟方法,而是具有不同签名的方法Module 的每个派生类都独立实现(或根本不实现,如果合适的话)。

如果你想做类似的事情

void some_method(Module* module, CounterType* ctype, uint64_t value) {
    module->inc(*ctype, value);
}

那么显然不使用虚拟方法在这里不是一个可行的解决方案,我没有关于哪种替代设计决策合适的答案,仅仅是因为我没有足够的信息来说明如何使用Module .

【讨论】:

    【解决方案2】:

    这不是安静的答案,而是:

    下面的链接显示了这个问题在 Java 中是如何解决的,c++ 没有什么可以做的

    Extending Enums

    我最终使用的解决方案:我将 Enums 设为模板参数。现在我可以根据我提供的模板值创建派生类

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2015-07-10
      • 2017-06-02
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2014-09-22
      • 2016-04-09
      相关资源
      最近更新 更多