【32】确定你的public继承塑模出Is-A关系
1、public继承表示Is-A关系,也就是满足里氏代换。与之相对应的,private继承表示根据某物实现出,不满足里氏代换。子类对象初始化父类引用,编译通不过。
2、考虑下面的需求,企鹅继承鸟,Bird暴露virtual Fly接口。现在出问题了,因为Penguin不会飞,不提供Fly接口。怎么办?
a、Penguin在重写的Fly方法中,抛出一个异常。
b、上面的解决办法不好,因为它表示的意义不是说Penguin不会飞,而是说尝试让Penguin飞,会出现错误。最大的问题是:运行期才发现错误。我们知道:好的接口可以防止无效的代码通过编译。现在思考,解决解决这个问题。这个问题的关键是:并不是所有的鸟都会飞,因此Bird不应该暴露Fly接口。解决办法就是:Bird不暴露Fly接口,Penguin也不暴露Fly接口,其他会飞的鸟暴露Fly接口。这样,用户就没办法对Penguin调用Fly接口。
3、再考虑矩形和正方形,从几何角度讲,正方形是一种矩形。从软件设计角度讲,正方形是矩形吗?应该使用public继承吗?思考:对矩形可以单独设置宽度,而不影响高度。但是对于正方形,设置宽度,要求高度随之变化,否者就不是正方形了。因此不能使用public继承。与此类似的还有:路径是String吗?路径应该public继承String吗? 不能。因为一个String加上另一个String还是一个有效的String,而一个路径加上另一个路径就不是一个路径了。
4、代码通过编译,不代表可以正常运行。因此,应该尽早暴露出问题,好的接口应该防止无效的代码通过编译。
【32】确定你的public继承塑模出Is-A关系的更多相关文章
- 条款32:确定你的public继承塑模出is-a的关系
Make sure public inheritance models "is –a " 如果令clsss D 以public的形式继承class B,你便是告诉编译器说,每一个类 ...
- Effective C++ -----条款32:确定你的public继承塑模出is-a关系
“public继承”意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derive class对象也都是一个base class对象 ...
- 条款32:确定你的public继承塑模出is-a 关系(Make sure public inheritacne models "is-a")
NOTE : 1."public继承"意味is-a.适用于base classes 身上的每一件事一定也适用于derived classes身上,因为每一个derived cla ...
- [Effective C++ --032]确定你的public继承塑模出is-a
这一章都在讲述继承的关系.可以举个例子说明: 父类是水果,子类是苹果,苹果是一种(is-a)水果,但是水果不一定就是苹果. is-a并不是唯一存在classes之间的关系.另两个常见的关系是has-a ...
- 读书笔记_Effective_C++_条款三十二:确定你的public继承继承塑模出is-a关系
这一条款是说的是公有继承的逻辑,如果使用继承,而且继承是公有继承的话,一定要确保子类是一种父类(is-a关系).这种逻辑可能与生活中的常理不相符,比如企鹅是生蛋的,所有企鹅是鸟类的一种,直观来看,我们 ...
- Effective C++ 笔记:条款 32 确定你的public继承塑造出正确的is-a关系
32 : Make sure public inheritance models "is-a." 0 引言 Inheritance and Object-Oriented Desi ...
- Effective C++ Item 32 确保你的 public 继承模子里出来 is-a 关联
本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:"public继承"意味 is-a.适用于 base classe ...
- Effective C++ -----条款38:通过复合塑模出has-a或“根据某物实现出”
复合(composition)的意义和public继承完全不同. 在应用域(application domain),复合意味has-a(有一个).在实现域(implementation domain) ...
- 读书笔记_Effective_C++_条款三十八:通过复合塑模出has-a或者is-implemented-in-terms-of
如果说public是一种is-a的关系的话,那么复合就是has-a的关系.直观来说,复合就是在一个类中采用其他类的对象作为自身的成员变量,可以举个例子,像下面这样: class Person { pr ...
随机推荐
- DOCTYPE, HTML和XHTML, Strict DTD和Transitional DTD, Quirks Mode和Standard Mode
在HTML里面声明DOCTYPE一般会有以下几种: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- 大四实习准备2_java异常处理_android控件练习
2015-4-24 Java 异常处理 可以有多个catch;ArrayIndexOutOfBoundsException类是Exception类的子类RuntimeException类的一个间接子类 ...
- Nginx+Tomcat+Terracotta的Web服务器集群实做
1.准备工作两个Linux服务器,可以用VMware装一个,然后配置好再克隆一个,修改IP即可.Host1:192.168.0.79Host2:192.168.0.80先配置好jdk1.6.0和tom ...
- 【Tcpcopy】离线回放功能
最近因调试问题,需要一直进行tcpcopy,拿有问题的包进行测试.决定使用tcpcopy对录制脚本进行回放,以下为我操作的具体步骤.主要是三块 1 下载安装具有离线回放功能的tcpcopy 2 使用t ...
- HDU5593 ZYB's Tree 树形DP +分治
感觉其实就是树分治,一次BC的题,感觉这次题目质量比较高,仅代表蒟蒻的看法 一次DFS获取每个点到子树的距离不大于K的点的个数, 然后一遍BFS获取从每个点父亲不大于K的的个数,层层扩展,还是想说 其 ...
- 玩一个:可以显示任何xml树结构的xaml定义
学习中, 玩一玩. 效果如下.Xaml随后. <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio ...
- [原创]一种简单的cocos2d-x动态更新方案
介绍一个曾经在cocos2d-x项目中使用过的动态更新方案,这个方案简单易行,针对小的项目非常有用. 这个方案有两个核心的关键词:JSON,MD5. 原理可以简单地概括为:服务端持有所有动态更新资源文 ...
- 【暑假】[实用数据结构]UVAlive 3942 Remember the Word
UVAlive 3942 Remember the Word 题目: Remember the Word Time Limit: 3000MS Memory Limit: Unknown ...
- HDU 1029 Ignatius and the Princess IV DP
kuangbin 专题 这题,有很多种解法. 第一种: 直接比较每个数出现次数. #include<iostream> #include<string> #include< ...
- uvalive 3890 Most Distant Point from the Sea
题意:求一个凸多边形中一点到边的最大距离. 思路:转换成在多边形内部,到每边距离为d的直线所围成的内多边形是否存在.也就是,二分距离+半平面交. #include<cstdio> #inc ...