在一个类层次结构的设计中,我使用了一个声明了各种派生类将要实现方法的抽象基类。从某种意义上说,这个基类在C++中就像是接口。但是,有一个具体的问题。考虑下面声明我们接口类的代码:
当然,这段代码无法编译,因为在C++中你不能返回一个抽象类。为了解决这个问题,我使用了以下解决方案:
这个解决方案可行且完美,但在我看来,它并不是很优雅,因为接口的参数存在多余的文本。如果你们能指出这个设计中的其他技术问题,我会很高兴,但这是我目前唯一关心的问题。
有没有办法消除这个多余的模板参数?可能使用宏?
注意:涉及的方法必须返回一个实例。我知道如果 method() 返回指针或引用就不会有问题。
class Interface {
public:
virtual Interface method() = 0;
};
class Implementation : public Interface {
public:
virtual Implementation method() { /* ... */ }
};
当然,这段代码无法编译,因为在C++中你不能返回一个抽象类。为了解决这个问题,我使用了以下解决方案:
template <class T>
class Interface {
public:
virtual T method() = 0;
};
class Implementation : public Interface<Implementation> {
public:
virtual Implementation method() { /* ... */ }
};
这个解决方案可行且完美,但在我看来,它并不是很优雅,因为接口的参数存在多余的文本。如果你们能指出这个设计中的其他技术问题,我会很高兴,但这是我目前唯一关心的问题。
有没有办法消除这个多余的模板参数?可能使用宏?
注意:涉及的方法必须返回一个实例。我知道如果 method() 返回指针或引用就不会有问题。
#define DERIVE_TEMPLATE_BASE(Derived, Base) class Derived : public Base<Derived>
,但这看起来非常丑陋,可能会让你的编辑器混淆。底线是 - 是的,存在冗余,但这是一个被广泛接受和可识别的惯用语。 - gwiazdorrrInterface<Implementation>
的析构函数,那么就没有关系。而且您也不会这样做,因为使用std::vector<Implementation>
而不是std::vector<Interface<Implementation>>
没有任何理由。 - Mooing Duck