我最近多次偶然发现的一个普遍问题:派生的优点和缺点与包含相比有哪些?
更具体一点:
class A : public std::vector<int> {};
或
class B {public: std::vector<int> elem;}
当然,在生产代码中,我会将elem
声明为私有,并实现公共getter和setter。
是否有一般性建议?
答案 0 :(得分:3)
一般建议不要从标准库容器派生。另请参阅this questions answers。
这个问题的第一个答案给出了关于Liskov substitution principle的注释,这可能是你的答案。
可替代性是面向对象编程的一个原则。它指出,在计算机程序中,如果S是T的子类型,则类型T的对象可以用类型S的对象替换(即,类型S的对象可以替换类型为T的对象)而不改变任何该程序的理想属性(正确性,执行任务等)。
答案 1 :(得分:1)
组合意味着has-a
关系,而继承意味着is-a
关系。
虽然您应该选择更能反映这种关系的那种,但一般建议使用composition
。
这Wikipedia page提供了一些解释。
这里也有类似的SO question。
答案 2 :(得分:0)
始终努力减少与客户的最小耦合。您公开的实体越多,可以将更复杂的客户端代码绑定到您的库,并且提供将来的更改和中断依赖项就越困难。
通常永远不会从任何标准库容器派生,这些容器不是基类。
相关参考文献:
答案 3 :(得分:0)
答案 4 :(得分:0)
我不确定这个问题是否与从stl类派生相关,但一般来说,如果类是相关的并且意思是完整的,我会去推导出来,举个类Car,engine和Hybrid Car的例子
混合动力汽车更有意义来自汽车和发动机在汽车内(遏制)。在继承的情况下,您可以使用强大的虚拟功能。
如果您想遵循开放式关闭原则
,通常会使用继承