特别是在C++中,通常也作为OO设计原则,执行以下操作是否有任何问题?它是在实践中完成的吗?如果它显示出明显的设计缺陷,那么什么是一个好的选择呢?有什么好处吗?
class Property {};
class CompositeProperty : public Property
{
...
private:
std::vector<Property> m_properties;
};
Run Code Online (Sandbox Code Playgroud)
具体来说,派生类可以包含基类对象吗?
由于我的背景,我已经看到这用于建模/镜像XML结构,但觉得设计有点面对is-a-is-inheritance和has-a-is-composition关系,人们通常会努力.
设计没有任何缺陷 - 实际上,这种设计距离众所周知且非常有用的复合图案只有一步之遥.但是,实施中存在重大缺陷.
您CompositeProperty聚合实例Property,而不是聚合指针.这会破坏使用CompositeProperty多态元素的能力.您需要使用指针向量(最好是智能指针)替换实例向量,以解决此问题.
复合模式的典型位置是表达式树的表示:从一个抽象基础开始,然后为常量,变量,函数调用,一元表达式,二进制表达式,条件等添加表示.诸如常量和变量之类的表达式不会引用其他表达式,而诸如一元表达式,二进制表达式和函数调用之类的表达式则会引用其他表达式.这使对象图递归,让您表示任意复杂性的表达式.