可能重复:
更喜欢组合而不是继承?
我最近几次偶然发现的一个一般性问题:与包含相比,派生有哪些优点和缺点?
更具体:
class A : public std::vector<int> {};
或者
class B {public: std::vector<int> elem;}
?
当然,在生产代码中,我会声明elem
为私有并实现公共 getter 和 setter。
有一般建议吗?
可能重复:
更喜欢组合而不是继承?
我最近几次偶然发现的一个一般性问题:与包含相比,派生有哪些优点和缺点?
更具体:
class A : public std::vector<int> {};
或者
class B {public: std::vector<int> elem;}
?
当然,在生产代码中,我会声明elem
为私有并实现公共 getter 和 setter。
有一般建议吗?
一般建议不要从标准库容器派生。另请参阅此问题的答案。
这个问题的第一个答案给出了关于Liskov 替换原则的注释,这可能是你的答案。
可替代性是面向对象编程的一个原则。它指出,在计算机程序中,如果 S 是 T 的子类型,则类型 T 的对象可以用类型 S 的对象替换(即,类型 S 的对象可以替换类型 T 的对象)而不改变任何该程序的理想属性(正确性、执行的任务等)。
始终努力将最小的耦合施加到您的客户身上。您公开的实体越多,可以绑定到您的库的客户端代码就越复杂,并且提供未来更改和中断依赖项变得越困难。
并且通常从不派生自任何标准库容器,这些容器并不意味着基类。
相关参考:
我不确定这个问题是否与从 stl 类派生有关,但一般来说,如果类是相关的并且意义完整,我会去派生,以 Car、engine 和 Hybrid Car 类为例
混合动力汽车从汽车内部的汽车和发动机(遏制)派生出来更有意义。在继承的情况下,您可以使用强大的虚函数。
如果要遵循 Open-Close 原则,通常使用继承