【发布时间】:2016-06-14 12:32:30
【问题描述】:
我有一个接口和一个实现它的类:
class InterfaceA
{
public:
enum Enum { X, Y, Z };
virtual void foo(Enum &) = 0;
virtual void bar() = 0;
};
class ClassA : public InterfaceA
{
public:
virtual void foo(Enum & a) {
a = X;
}
virtual void bar();
};
我需要在一个方面扩展 InterfaceA 实现类的功能。据我了解,这就是 mixin 的用途。
例如foo() 应该在某些条件下更改其参数值。这是我的做法:
template <typename T>
class Mixin : public T
{
public:
virtual void foo(Enum & a) {
T::foo(a);
if (a == X){
a = Y;
}
}
};
问题是,除非我将范围前缀写入接口类中定义的标识符或像这样对它们进行类型定义,否则它不会编译:
template <typename T>
class Mixin : public T
{
public:
typedef InterfaceA::Enum Enum;
virtual void foo(Enum & a) {
T::foo(a);
if (a == InterfaceA::X){
a = InterfaceA::Y;
}
}
};
如果接口定义中的此类类型很少,这没什么大不了的。但是如果有很多,它可能会变得丑陋。我希望代码能够反映 Mixin 通过设计操纵 InterfaceA 对象的事实。不幸的是,从 InterfaceA 继承 Mixin 引入了一个我最好避免的“可怕的钻石”。这可能吗?
【问题讨论】: