第八章 抽象二:继承
第八章 抽 象 二: 继 承
81抽象数据类型回顾 第五章中,ADT是程序员定义的新数据类型,包括: 1、一个程序员定义的数据类型。 2、一组在该类型对象上的抽象操作。 3、该类型对象的封装。新类型的用户只能通过定义的操作 来操纵那些对象。 数据抽象是前面讨论的程序设计的基础部分,涉及抽象数据对 象及其操作的定义。 如果语言没有提供对数据抽象的支持,程序员仍然可以设计自 己的抽象数据类型,当然,这个概念在语言中颁布存在。程序 员需使用“编码约定”来组织他的程序。在这种情况下,封装 是不可能的。 类型定义使得变量的声明简单化,只需在声明中写入类型名。 但是,该类型的数据对象的内部结构不能对外封装
8.1 抽象数据类型回顾 第五章中,ADT是程序员定义的新数据类型,包括: 1、一个程序员定义的数据类型。 2、一组在该类型对象上的抽象操作。 3、该类型对象的封装。新类型的用户只能通过定义的操作 来操纵那些对象。 数据抽象是前面讨论的程序设计的基础部分,涉及抽象数据对 象及其操作的定义。 如果语言没有提供对数据抽象的支持,程序员仍然可以设计自 己的抽象数据类型,当然,这个概念在语言中颁布存在。程序 员需使用“编码约定”来组织他的程序。在这种情况下,封装 是不可能的。 类型定义使得变量的声明简单化,只需在声明中写入类型名。 但是,该类型的数据对象的内部结构不能对外封装
任意一个可以声明某类型变量的子程序均可以访问该类型表示 的任意分量。任何这样的子程序均可以旁路数据对象上定义的 操作,而直接访问和操作该数据对象的部件。 封装的意图是要使得这样的访问不可能。仅仅那些知道数据对 象的内部表示的子程序是该类型上的操作,被定义为类型的 部分。 Ada、C艹+、 Smalltalk等语言提供了抽象类型定义机制。Ada中 的 Package是抽象数据类型定义的形式。图8.1是一个例子 Private部分指出外界不能访问的内部结构。在包中定义的子程序 才可以访问私有数据
任意一个可以声明某类型变量的子程序均可以访问该类型表示 的任意分量。任何这样的子程序均可以旁路数据对象上定义的 操作,而直接访问和操作该数据对象的部件。 封装的意图是要使得这样的访问不可能。仅仅那些知道数据对 象的内部表示的子程序是该类型上的操作,被定义为类型的一 部分。 Ada、C++、Smalltalk等语言提供了抽象类型定义机制。Ada中 的Package是抽象数据类型定义的形式。图8.1是一个例子。 Private部分指出外界不能访问的内部结构。在包中定义的子程序 才可以访问私有数据
package SectionType is type StudentID is integer; Ada type Section(Max Size: integer) is private procedure Assign Student(Sect: in out Section Stud in StudentID): procedure Create Section(Sect: in out Section 中抽象数据类型定义 Instr in integer; Room in integer) rivate type Section(MaxSize: integer) is record Room: integer; Instructor: integer; Class Size: integer range 0.. Max Size: =0; ClassRoll: array(1.MaxSize)of StudentID end record end package body Section Type is procedure Assign Student(. )is Statements to insert student on Class roll en d: procedure Create Section(. )is Statements to initialize components of Section record end: procedure Schedule Room(.)is Statements to schedule Section in a room end end
Ada 中 抽 象 数 据 类 型 定 义
实现 图82给出了实现封装数据对象的两个模型。 间接封装(图82(a)):抽象数据类型的结构包规约A定 义,对象P的实际存储在A的激活记录中维护。包B中声明和 使用对象P,运行时激活记录必须包含一个到实际数据存储 的指针。 直接封装(图8.2(b)):对象P的实际存储在B的激活记录 中维护。 在间接封装中,ADT的实现独立于其使用,A的内部修改不 影响B。但运行时间花销大。 直接封装中:和上面情形相反,对P的访问会省时间,但如 抽象对象的表示改变,所有它的使用的实例需重编译。时间 花销在编译过程中。 Ada使用直接封装模型。因此翻译抽象数据对象的使用将需 要对象表示的详细细节,即需知道包规约中的私有部分
•实现 图8.2给出了实现封装数据对象的两个模型。 间接封装(图8.2(a)):抽象数据类型的结构包规约A定 义,对象P的实际存储在A的激活记录中维护。包B中声明和 使用对象P,运行时激活记录必须包含一个到实际数据存储 的指针。 直接封装(图8.2(b)):对象P的实际存储在B的激活记录 中维护。 在间接封装中,ADT的实现独立于其使用,A的内部修改不 影响B。但运行时间花销大。 直接封装中:和上面情形相反,对P的访问会省时间,但如 抽象对象的表示改变,所有它的使用的实例需重编译。时间 花销在编译过程中。 Ada使用直接封装模型。因此翻译抽象数据对象的使用将需 要对象表示的详细细节,即需知道包规约中的私有部分