《面向对象的思考过程(原书第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是各自对象自身的职责。在如今很多软件应用(比如在绘图和文字处理应用)中都会使用多态概念。
相关文章
|
13天前
|
Serverless PHP
当谈论面向对象编程时,这四个概念是非常重要的。以下是对接口、继承、封装和多态的简要说明
本文介绍了面向对象编程的四个核心概念:接口、继承、封装和多态。接口定义对象的行为规范,类通过实现接口确保符合所需行为。继承允许在已有类基础上创建新类,实现代码重用。封装是将数据和操作捆绑并隐藏内部细节,提高安全性和可维护性。多态使对象在运行时能表现出不同行为,增加代码灵活性和可扩展性。文中还提供了代码示例来说明这些概念。
6 0
|
19天前
|
编译器 C语言 C++
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
|
2月前
|
算法 编译器 C语言
【C/C++ 编程题 01】用C++设计一个不能被继承的类
【C/C++ 编程题 01】用C++设计一个不能被继承的类
24 0
|
4月前
掌握面向对象程序设计继承和派生机制的概念
掌握面向对象程序设计继承和派生机制的概念
14 0
|
5月前
|
Java
Java面向对象编程,解释封装、继承和多态的概念。
Java面向对象编程,解释封装、继承和多态的概念。
40 2
|
5月前
|
编译器 C++
[C++] 面向对象的三大特性:封装、继承和多态
[C++] 面向对象的三大特性:封装、继承和多态
34 0
|
7月前
|
存储 算法 Java
面向对象编程实践:类、对象与继承
面向对象编程实践:类、对象与继承
34 0
|
8月前
|
设计模式 数据安全/隐私保护
面向对象编程基础:封装、继承、多态与抽象的全面解析
面向对象编程基础:封装、继承、多态与抽象的全面解析
30 0
|
10月前
浅谈 面向对象三大特性:封装 继承 多态
浅谈 面向对象三大特性:封装 继承 多态
70 0
|
11月前
|
设计模式 存储 安全
【Java设计模式 面向对象设计思想】一 再谈面向对象和封装、抽象、继承、多态四大特性
【Java设计模式 面向对象设计思想】一 再谈面向对象和封装、抽象、继承、多态四大特性
55 0