C++编程规范之37:公用继承即可替换性。继承,不是为了重用,而是为了被重用
来源:互联网 发布:电视软件哪个资源多 编辑:程序博客网 时间:2024/05/22 16:48
摘要:
知其然:公用继承能够使基类的指针或者实际引用指向某个派生类的对象,既不会破坏代码的正确性,也不需要改变已有的代码。
还要知其所以然:不要通过公用继承重用(基类中的已有)代码,公用继承是为了被(已经多态地使用了基对象的已有代码)重用的。
按照Liskov替换原则(LiskovSubstitution Principle),公用继承所建模的必须总是“是一个(is-a)”关系:所有基类约定必须满足这一点,因此如果依靠成功地满足基类的约定,所有虚拟成员函数的改写版本就必须不多于其基类版本,其承诺的也必须不少于其基类版本。使用指向Base的指针或者引用的代码必须能正确工作,即使指针或者应用实际上指向的是Derived。
继承的误用将破坏正确性。没有被正确实现的继承大多数都会无法遵守基类确定的显式或者隐式约定而迷乱。这种约定可能是很微妙的,如果无法在代码中直接表达,程序员就必须格外小心。
公用继承的目的是实现可替换性,公用继承的目的并不是为了派生类重用积累的代码,从而用基类代码实现自己。这种“用……来实现”的关系可能完全没有问题,但是应该用组合关系来建模——或者仅仅在某些特殊情况下,通过非公用继承来实现。
还可以用另一种说法来表述:当动态多态正确而且适合时,组合是自私的,而继承是慷慨的。心的派生类是已有通用抽象的新特例。已有的动态代码通过调用Base的虚拟函数来使用Base&或者Base*,应该能够无缝地使用继承自Base的MyNewDerivedType的对象。心的派生类型向已有代码中添加新功能时,不需要修改已有代码,而是可以在加入新派生对象时无缝地增加其功能。
新的需求应该很自然地由新代码满足,心的需求不应该导致对已有代码的重新改写。
在面向对象技术出现之前,新代码掉哟个已有代码就一直很容易。尤其是公用继承使已有代码安全无缝地调用新代码变得更加容易了。
- C++编程规范之37:公用继承即可替换性。继承,不是为了重用,而是为了被重用
- ATL中的多继承模板类,不是为了同类功能的扩展,而是为了某类功能的添加。
- 代码重用,多重继承
- 公有继承即可替换性
- c++代码重用之私有继承
- 多线程不是为了提高效率,而是不必等待
- 【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程
- 泛型:是为了代码重用,算法重用。【今天的天很兰、很兰、很兰】
- 利用继承进行JAVA的代码重用
- 实现类重用 继承和组合比较
- 代码重用(继承和组合)
- unity3d 重用,继承,泛型等使用
- 《Object-Oriented Programming With ANSI-C》之第四章(继承——代码重用和改进)
- 坚强而不做作的生活,不是为了任何人,而是为了活出精彩的自己!
- 测试不是为了找出所有BUG,而是为了满足用户需求
- 努力和上进不是为了做给别人看,而是为了不辜负自己
- 努力和上进不是为了做给别人看,而是为了不辜负自己
- 【C#】C#OOP编程之继承性
- Android Activity 生命周期的透彻理解
- [算法导论]第八章《线性时间排序》
- CSV文本数据如何导入oracle
- Perl5 split 函数的使用详细讲解
- scanf()格式说明符
- C++编程规范之37:公用继承即可替换性。继承,不是为了重用,而是为了被重用
- tar.gz与zip的区别
- boost的使用(一)
- 字符串压缩
- JavaWeb中Ajax 对 Json 格式的解析
- python命令行终端下操作界面库(curses,urwid,npyscreen)
- 在Vega Prime中设定物体的运动路径
- apt-get 使用详解
- 二叉树重建