[英]C++: design advice
我需要一些有关类层次结构设计的建议。 我当前设计的“骨架”是
template <class X>
class BASE {
public:
virtual void f() {
x_.f2(m_);
}
void g() {
/* do stuff here*/
x_.g();
}
/* more member functions here*/
protected:
X x_;
int m_;
};
template <class X>
class DERIVED : BASE<X> {
public:
virtual f() override {
x_.f1();
}
protected:
using BASE<X>::x_;
using BASE<X>::m_;
};
最后我又有两个这样的课程
struct X1 {
void f1();
void g();
};
struct X2 : X1 {
void f2(int m);
};
我希望能够创建DERIVED<X1>
的实例。 为此,编译器将首先创建BASE<X1>
的实例,在这种情况下,它将抱怨X1没有成员函数f2(尽管实际上它永远不会被调用,因为调用函数f()是虚拟)。
我知道这是一个糟糕的设计,因为要拥有模板化的类,模板参数必须具有相同的接口。 在我的情况下,X1和X2具有公共接口,但是X2具有更多功能,从而产生了上述问题。 我知道我可以在X1中创建一个不执行任何操作的f2函数,但理想情况下,我希望避免这种情况。
我欢迎任何改进设计的建议。 提前致谢!
首要建议是不要使用受保护的属性。 正在打破封装。
第二种建议是使virtual void f()=0
完全不执行而成为纯虚virtual void f()=0
。 这样,派生类就不会有错误。
避免派生出具体的类。 将接口/ ABC提升到顶部,使所有具体类都离开。 这是针对许多设计难题的一般建议。
在您的特定情况下,请执行以下操作:
BASE // concrete
|
DERIVED
用这个:
BASE // fully abstract
/ \
BASIC_DERIVED ADVANCED_DERIVED
现在f
在BASE
是纯虚拟的,一切都很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.