频道栏目
读书频道 > 软件开发 > C++ > C++高级编程(第2版)
3.4.2 “是一个”关系(继承)
2012-10-17 10:06:35     我来说两句
收藏   我要投稿

本文所属图书 > C++高级编程(第2版)

C++是当今最流行的高级程序设计语言之一,常用于编写性能卓越的企业级面向对象程序,如游戏或大型商业软件。但一个无法规避的事实是:C++语法纷繁复杂,学习难度较大。如何才能化繁为简,全面系统地快速掌握C++知...  立即去当当网订购

“是一个”关系是面向对象编程的非常基本的概念,因此有许多名称,包括子类(subclass)、扩展(extending)以及继承(inheriting)。类模拟现实世界包含具有属性以及行为的对象这一事实,继承模拟这些对象通常以层次方式结合这一事实。“是一个”说明了层次关系。

基本上,“是一个”的模式是A是一个B,或者A实际上与B非常相似—— 这可能比较棘手。再次用简单的动物园为例,但是在此假定除了猴子之外还有其他动物。这句话本身已经建立了关系—— 猴子是一种动物。与此类似,长颈鹿也是一种动物,袋鼠是一种动物,企鹅也是一种动物。那又怎么样?当您意识到猴子、长颈鹿、袋鼠以及企鹅具有某种共性时,继承的魔力就出现了。这些共性就是动物的一般特征。

对于程序员的启示就是,可以定义一个Animal类封装所有动物都具有的属性(大小、生活区域、食物等)以及行为(移动、进食、睡觉)。特定的动物(例如猴子)成为Animal的子类,因为猴子包含了动物的所有特征。记住,猴子是动物,并且还有使它与众不同的其他特征。图3-4显示了动物的继承图示。箭头表明继承关系的方向。


 

就像猴子与长颈鹿是不同类型的动物一样,用户界面通常也具有不同类型的按钮。例如,复选框是一个按钮,按钮只是一个可以被点击并执行操作的UI元素,Checkbox通过添加状态(相应的框是否被选中)扩展了Button类。

当类之间具有“是一个”关系时,目标之一就是将常用功能放入超类(superclass),一个可以被其他类扩展的类。如果您发现所有的子类都具有相似或者完全相同的代码,就应该考虑将一些或者全部代码放入超类。通过这种方法,所需的改动可以在一个地方完成,将来的子类可以“自由地”获取这些共享的功能。

1. 继承技术

前面的示例非正式地讲述了继承中使用的一些技术。当生成子类时,程序员有多种方法将某个对象与其父对象(parent object)或者超类(superclass)区分开来。生成子类有多种方法,生成子类实际上就是完成语句A is a B that…的过程。

添加功能

子类可以在超类的基础上添加功能。例如,猴子是一种可以挂在树上的动物。除了具有Animal的所有行为之外,Monkey类还具有在树间游动的行为,这个行为只存在于Monkey类。

替换功能

子类可以完全替换或者重写超类的行为。例如,大多数动物都是步行,因此您可能会让Animal类拥有一个模拟步行的move行为。但是袋鼠是一种通过跳跃而不是步行移动的动物,Animal超类的其他属性以及行为仍然适用,Kangaroo子类只需要替换move行为的运行方式。当然,如果您发现将超类所有的功能都进行了替换,这可能意味着这个子类根本不应该是子类,除非这个超类是一个抽象超类。抽象超类用作子类的超类,并强迫每个子类实现某个行为,抽象超类无法创建实例,第8章将介绍抽象类。

添加属性

子类还可以向从超类继承来的属性中添加新属性。企鹅具有动物所有的属性,此外还有一个鸟嘴大小属性。

替换属性

与重写行为的方式类似,C++提供了重写属性的方法。然而,这么做通常是不合适的。不要把替换属性的概念与子类具有不同属性值的概念混淆。例如,所有动物都具有表明它们吃什么的diet属性,猴子吃香蕉,企鹅吃鱼,二者都没有替换diet属性—— 只是赋给属性的值不同而已。

2. 多态性与代码重用

多态性(Polymorphism)指具有标准属性和行为的对象可以互换使用。类定义就像是对象以及与其交互的代码之间的契约。根据定义,Monkey对象必须支持Monkey类的属性和行为。

这个概念也可以推广到超类。由于所有的猴子都是动物,因此所有的Monkey对象都支持Animal类的属性和行为。

多态性是面向对象编程的亮点,因为多态性真正地利用了继承所提供的功能。在模拟动物园时,您可以遍历所有动物园中的动物,并且让每个动物都移动一次。由于所有动物属于Animal类,因此它们知道如何移动。某些动物重写了移动行为,但是这正是亮点所在—— 代码只是告诉每个动物移动,而不知道也不关心是哪种动物。所有的动物都会以自己的方式移动。

除了多态性之外,使用子类还有另一个原因,通常这只是一个利用现有代码的问题。例如,如果您需要一个具有回声效果的播放音乐类,而您的同事已经编写了一个播放音乐的类,但是没有任何其他效果,您可以将这个已有的类扩展,添加新的功能。“是一个”关系仍然适用(回声音乐播放器是一个增添了回声效果的音乐播放器),但是您不打算互换地使用这些类。最终您得到两个独立的类,用在程序完全不同的部分(或者用于完全不同的程序),只是为了避免重复的工作二者才有了那么一点关系。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.4.1 “有一个”关系
下一篇:3.4.3 “有一个”与“是一个”的区别
相关文章
图文推荐
排行
热门
最新书评
文章
下载
读书
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站