【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 ...
随机推荐
- 【HDOJ】4305 Lightning
1. 题目描述当一个结点lightning后,可以向其周围距离小于等于R的结点传播lightning.然后以该结点为中心继续传播.以此类推,问最终形成的树形结构有多少个. 2. 基本思路生成树级数模板 ...
- Zookeeper基本知识
Zookeeper的Session: (1)客户端和server间采用长连接 (2)连接建立后,server产生session ID(64位)返还给客户端 (3)客户端定期发送ping包来检查和保持和 ...
- poj 2031 Building a Space Station(prime )
这个题要交c++, 因为prime的返回值错了,改了一会 题目:http://poj.org/problem?id=2031 题意:就是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能 ...
- 函数buf_LRU_search_and_free_block
/******************************************************************//** Try to free a replaceable bl ...
- BZOJ_1022_[SHOI2008]_小约翰的游戏John_(博弈论_反Nim游戏)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1022 反Nim游戏裸题.详见论文<组合游戏略述——浅谈SG游戏的若干拓展及变形>. ...
- [转] web.xml文件详解
转自:http://www.cnblogs.com/hellojava/archive/2012/12/28/2835730.html 前言:一般的web工程中都会用到web.xml,web.xml主 ...
- java适配器模式
原文查看:http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html
- Hibernate配置文件解释
Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性每个Hibernate配置文件对应一个Configuration对象Hibernate配置文件可以有两种格式: ...
- memcache 存储单个KEY,数据量过大的时候性能慢!以及简单的memcache不适合用到的场景
今天有人问到我:memcache存储大数据量,10K,100K,1M的时候,效果怎么样??我回答:不好,效果非常慢.对方问:为什么啊??我回答不上来...于是就找了点资料. memcached使用需要 ...
- Android中Bitmap和Drawable,等相关内容
一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...