《面向对象的思考过程(原书第4版)》一1.9 继承

本节书摘来自华章出版社《面向对象的思考过程(原书第4版)》一书中的第1章,第1.9节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.9 继承

面向对象程序设计的最强大的功能之一就是代码重用。结构化设计提供的代码重用非常受限。你可以编写一个功能块,然后多次重用它。但是面向对象的设计更进一步,允许你定义类之间的关系,通过组织和识别不同类之间的共性,不仅可以实现代码重用,也可以指导设计。继承是实现该功能的主要手段。
继承允许一个类继承另一个类的属性和方法。我们可以通过抽象公共属性和行为来创建新类。
面向对象程序设计中的一个主要设计问题就是识别多个类的共性。例如,假设你有一个Dog(狗)类和一个Cat(猫)类,这两个类都有一个属性来表示眼睛颜色。在过程化模型中,Dog和Cat的代码中都会包含这个属性。在面向对象的设计中,可以将颜色属性上移到一个名为Mammal(哺乳动物)的类中。该类也会包含一些其他的公共属性和方法。在本例中,Dog类和Cat类都继承自Mammal类,如图1-14所示。
1_14
当Dog或Cat对象被实例化时,它包含了自身类的所有东西,也包含了从父类获取到的东西。即Dog拥有自身类定义的所有属性,也包含了从Mammal类继承过来的属性。

1.9.1 超类和子类

超类,也称为父类(有时候也叫作基类),包含了继承自它的所有类的公共属性和行为。例如,在Mammal类的例子中,所有的哺乳动物拥有相似的属性,比如eyeColor和hairColor,也有相似的行为,比如generateInternalHeat和growHair。所有的哺乳动物都有这样的属性和行为,所以没必要在哺乳动物继承树中为每个动物中都重复一遍。重复不仅加重工作量,而且会带来更多问题,因为会引入错误和矛盾。
子类,也称为孩子类(有时被叫作衍生类),是超类的扩展。比如,Dog和Cat类从Mammal类继承了所有的公共属性和行为。Mammal类是Dog和Cat子类的超类。
继承提供了丰富的设计优势。当设计Cat类时,Mammal类提供了很多需要的功能。通过继承自Mammal对象,Cat已经拥有了成为真正的哺乳动物的所有属性和行为。为了让猫这种哺乳动物更加具体,Cat类必须拥有猫自身独一无二的属性或行为。

1.9.2 抽象

继承树可能会增长的非常庞大。当Mammal和Cat类完成后,可以快速添加其他哺乳动物,比如狗(或者狮子、老虎和熊)。Cat类也可以作为其他类的父类,比如作为塔罗猫等猫的父类。而Dog类也可以作为GermanShepherd(德国牧羊犬)和Poodle(卷毛小狗)的父类(见图1-15)。继承的力量在于它的抽象和组织技术。


6e5d93425f39acac2261c4b547e1eba28ff4aab6



在大多数最新的面向对象的语言中(比如Java、.NET和Objective C),一个类只能有一个父类,然而一个类可以有多个子类。另一些语言中,比如C++,可以拥有多个父类。前一种情况称为单继承,后一种情况称为多重继承。
请注意GermanShepherd类和Poodle类都继承自Dog类。每个类只有一个方法。然而由于它们继承自Dog,所以它们也继承自Mammal。即GermanShepherd和Poodle类获取了Dog和Mammal中所有的属性和方法,同时也拥有它们自身的属性和方法(如图1-16所示)。

3b535438bcc84d01894c199b209046c42600d8ca


1.9.3 is-a关系

在Shape(形状)例子中,Circle(圆形)、Square(矩形)和Star(星形)都直接继承自Shape。这种关系通常被称为is-a关系,因为圆是一个形状,而矩形也是形状。当子类继承自父类时,任何父类能做的事情子类都可以做。即Circle、Square和Star都是Shape的扩展。


ed05cecc44100848d37792000debf2c0b09d6133



在图1-17中,每个对象上的名字Draw分别代表了Circle、Star和Square对象的Draw方法。当我们设计Shape系统时,采用这种方式对各种各样的形状进行标准化。这种方式非常有用,如果我们约定绘制形状时只需调用Draw方法即可,而不用管具体是什么形状。那么只要遵守这一约定,无论什么时候绘制形状,只需调用Draw方法即可。这正好展示了多态的基本概念,即绘制Circle、Star或Square是各自对象自身的职责。在如今很多软件应用(比如在绘图和文字处理应用)中都会使用多态概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值