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

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

1.9 继承

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

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

1.9.3 is-a关系

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

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

时间: 2025-01-24 21:54:55

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

《面向对象的思考过程(原书第4版)》一1.1 基本概念

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.1节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著 1.1 基本概念 本书主要目标是让你学会思考如何将面向对象概念应用于面向对象的系统设计中.历史上定义面向对象的语言拥有以下特点:封装(encapsulation).继承(inheritance)和多态(polymorphism).因此,如果设计一门语言时没有完全实现以上特性,那么通常我们认为该语言不是完全面向对象的.即使实现了这三点,我也往往会加入组

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

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.5节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 3.5 多重继承 第7章会讲述有关继承的更多细节.然而,这里很适合讨论多重继承.多重继承是类设计中最强大也最具挑战的一个方面. 顾名思义,多重继承允许一个类继承自多个类.实际看起来这是个好主意.对象都应该模拟现实世界,不是吗?现实世界中存在很多多重继承的例子.父母是多重继承的

《面向对象的思考过程(原书第4版)》一 第3章 高级的面向对象概念

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.1节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 第3章 高级的面向对象概念 第1章和第2章讲述了面向对象的基本概念.在开始学习关于构建面向对象系统的一些具体设计问题之前,我们需要更进一步了解面向对象的一些概念,比如构造函数.操作符重载以及多重继承.我们也会讲述错误处理技术以及面向对象的设计中作用域的重要性.其中一些概念可能

《面向对象的思考过程(原书第4版)》一1.3 过程式编程与面向对象编程

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.3节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.3 过程式编程与面向对象编程 在我们深入了解面向对象开发的优势之前,先考虑一个更基本的问题:究竟什么是对象?这既是一个复杂的问题,也是一个简单的问题.它复杂是因为学习任何一种软件开发方法论都非易事.它简单是因为人们已经在按对象的方式进行思考.例如,当你看到一个人,你会把他

《面向对象的思考过程(原书第4版)》一1.6 究竟什么是类

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.6节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.6 究竟什么是类 简单地说,类是对象的蓝图.当你实例化一个对象时,你基于类来构建这个对象.事实上,尝试解释类和对象实际上是一个先有鸡还是先有蛋的问题.描述类时不使用术语对象是非常困难的,反之亦然.例如,个人自行车是一个对象.然而,有人已经创建了蓝图(就是类)来建造这个自行

《面向对象的思考过程(原书第4版)》一1.10 多态

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.10节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.10 多态 多态是一个希腊词,字面上理解为许多形状.尽管多态与继承是紧耦合的关系,但它通常单独作为面向对象技术中最强大的优点之一.当向一个对象发送一个消息时,该对象必须定义一个方法来响应这个消息.在继承体系图中,所有的子类从它们的超类中继承接口.然而,由于每个子类是单独

《面向对象的思考过程(原书第4版)》一第1章 面向对象的概念简介

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,[美] 马特·魏斯费尔德(Matt Weisfeld) 著 第1章 面向对象的概念简介 很多程序员其实并不知道在20世纪60年代就已出现面向对象的软件开发方式.尽管受欢迎的面向对象的编程语言(例如Smalltalk和C++)已被广泛使用,但直到90年代中后期面向对象范式才开始快速发展.面向对象方法论的兴起恰逢互联网作为商业及娱乐平台之际.总之,对象借助网络能良好协作.后来显然互联网存活下来,而面向对象的技术已经在开发新的

《面向对象的思考过程(原书第4版)》一1.8.1 接口

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.8节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.8.1 接口 我们可以看到接口定义了对象之间通信的基本手段.每个类设计接口规格来保证对象能被正确实例化和操作.必须向对象提供的接口发送消息来使用对象暴露的任何行为.接口需要完整描述类与类之间的交互.在大多数面向对象的语言中,访问修饰符指定为public的方法属于接口.私有

《面向对象的思考过程(原书第4版)》一3.7 结语

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.7节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 3.7 结语 本章涵盖了一些面向对象的高级概念.虽然对于大致理解面向对象,可能没必要学习这些概念,但对于面向对象的更高一级任务(比如设计类)则是非常必要的.在第4章中,我们开始具体来看如何设计和构造类.