第八章 抽象二:继承
第八章 抽 象 二: 继 承
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使用直接封装模型。因此翻译抽象数据对象的使用将需 要对象表示的详细细节,即需知道包规约中的私有部分
抽象数据的两种实现模型 Activation record Activation record Activation record Activation record package A package B package A package B (a)Indirect encapsulation of object P(b)Direct encapsulation of object P
抽象数据的两种实现模型
直接封装和间接封装可以用在支持封装的任何程序中,而不 管其在语言中实现的封装模型是什么 虽然Ada中使用直接封装,程序员也可以实现间接封装 图8.3展示了Ada中的两种实现策略。分别对应图82的两种模 型的实现。 图8.3b的直接封装的变体可以为: acKage A Type MyStack is record Top: integer A: array(1.100)of integer End record 在此情形,激活记录组织和直接封装一样,但是,所有名字 均在B中可见。 这也是在不提供封装机制的语言中常用的方式
直接封装和间接封装可以用在支持封装的任何程序中,而不 管其在语言中实现的封装模型是什么。 虽然Ada中使用直接封装,程序员也可以实现间接封装。 图8.3展示了Ada中的两种实现策略。分别对应图8.2的两种模 型的实现。 图8.3b的直接封装的变体可以为: Package A is Type MyStack is record Top: integer; A: array (1..100) of integer; End record; …. 在此情形,激活记录组织和直接封装一样,但是,所有名字 均在B中可见。 这也是在不提供封装机制的语言中常用的方式
Ada数据的两种封装例子 package A is package A is type MyStack is private type MyStack is private procedure Newstack(S: out My Stack); procedure NewStack(S: out My Stack) private private type MyStackRep type My Stack is record Hidden details of MyStack Top: integer type MyStack is access MyStackRep: A: array(1.100)of integer B only has poiter to stack end record end B has structure of stack 指针类型 end (a) Indirect encapsulation (b)Direct encapsulation
Ada数据的两种封装例子 指针类型
类属抽象数据类型 语言固有的基本数据类型经常允许程序员声明一类新的数据 对象的基本类型,然后规约数据对象的几个属性。这是简单 的多态形式。 如, PASCAL提供了基本的数组类型,但也留下了用户可以 进一步定义的部分,如下标范围。 Type Vect =array [110] of real 图84是一个整数栈的规约。如要实数栈,则需另外规约。 类属抽象类型定义允许类型的一个属性被分离地规约,从而 给出一个基类型定义。使用该属性为参数,进而可从同一个 基类型导出几个特殊类型。 它们的结构和基类型类似,但参数可影响抽象类型定义中操 作的定义以及类型本身的定义。参数可以是类型名或值。图 85是类属栈类型的例子
•类属抽象数据类型 语言固有的基本数据类型经常允许程序员声明一类新的数据 对象的基本类型,然后规约数据对象的几个属性。这是简单 的多态形式。 如,PASCAL提供了基本的数组类型,但也留下了用户可以 进一步定义的部分,如下标范围。 Type Vect = array [1..10] of real; 图8.4是一个整数栈的规约。如要实数栈,则需另外规约。 类属抽象类型定义允许类型的一个属性被分离地规约,从而 给出一个基类型定义。使用该属性为参数,进而可从同一个 基类型导出几个特殊类型。 它们的结构和基类型类似,但参数可影响抽象类型定义中操 作的定义以及类型本身的定义。参数可以是类型名或值。图 8.5是类属栈类型的例子
Ada package IntstackType is type Stack(Size: Positive)is private procedure Push(l: in integer; S: in out Stack) 中整数栈抽象 procedure Pop(I: out integer; S: in out Stack); private type Stack(Size: Positive)is record StkStorage: array(1. Size)of integer; Top: integer range.. Size: =0; end record: end Int Stack Type; package body Int StackType is procedure Push(I: in integer; S: in out Stack) is begin Body of Push procedure end; procedure Pop(I: out integer; S: in out Stack) is begin Body of Pop procedure end: end IntstackType
Ada 中 整 数 栈 抽 象