接口classe中的枚举类

时间:2018-02-09 22:03:01

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

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

class Module {
public:

    virtual ~Module() = default;

    virtual void inc(CounterType, uint64_t) = 0;

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

这里counterType是一个枚举类(来自cpp11)。所以从我的接口类派生的模块应该使用它自己的一组enum classe(它们也是模块特定的)

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

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

2 个答案:

答案 0 :(得分:0)

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

由于与您的不同Module关联的枚举不同,这些Module的界面也应该不同,因此incdec不应该是虚拟的方法,而是具有不同签名的方法,每个派生类Module独立实现(或者根本不实现)。

如果你想做类似

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

然后显然不使用虚拟方法在这里不是一个可行的解决方案而且我没有关于替代设计决策适当的答案仅仅是因为我没有关于Module如何的足够信息使用。

答案 1 :(得分:0)

答案不是很安静但是:

以下链接显示了如何在Java中解决问题,没有什么可以用c ++做的事情

Extending Enums

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