一个程序员定义的数据类型.PPT

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 继承 抽象: 数据 处理(或方法) 自动封装: 抽象数据类型 自动推导数据对象的操作—继承 操作的多态 Smalltalk简介 7.1?? 抽象数据类型回顾 数据抽象类型 基本概念,及与类型定义的区别 实现 类属抽象数据类型 基本概念 实例化 实现 抽象数据类型 ADT是程序员定义的新数据类型,包括: 1、一个程序员定义的数据类型。 2、一组在该类型对象上的抽象操作。 3、该类型对象的封装。新类型的用户只能通过定义的操作来操纵那些对象。 数据抽象是程序设计的基础部分,涉及抽象数据对象及其操作的定义。 类型定义与封装 类型定义使得变量的声明简单化,只需在声明中写入类型名。但是,该类型的数据对象的内部结构不能对外封装。 任意一个可以声明某类型变量的子程序均可以访问该类型表示的任意分量。任何这样的子程序均可以旁路数据对象上定义的操作,而直接访问和操作该数据对象的部件。 封装的意图是要使得这样的访问不可能。仅仅那些知道数据对象的内部表示的子程序是该类型上的操作,且被定义为类型的一部分。 抽象数据类型:例子 Ada、C++、Smalltalk等语言提供了抽象类型定义机制。 Ada中的Package是抽象数据类型定义的形式。 Private部分指出外界不能访问的内部结构。在包中定义的子程序才可以访问私有数据。 Ada中抽象数据类型定义 抽象数据类型:实现 实现封装数据对象的两个模型。 间接封装(图(a)) 抽象数据类型的结构包A中不仅有对象P的定义,对象P的实际存储在A的激活记录中维护。包B中声明和使用对象P,运行时激活记录必须包含一个到实际数据存储的指针。 直接封装(图(b)) 对象P的实际存储在B的激活记录中维护。 抽象数据类型:实现 Ada使用直接封装模型。因此翻译抽象数据对象的使用将需要对象表示的详细细节,即需知道包规约中的私有部分。 直接封装和间接封装可以用在支持封装的任何程序中,而不管其在语言中实现的封装模型是什么。 抽象数据类型:实现 虽然Ada中使用直接封装,程序员也可以实现间接封装。 Ada中的两种实现策略: 图b的直接封装的变体可以为: Package A is Type MyStack is record Top: integer; A: array (1..100) of integer; End record; …. 在此情形,激活记录组织和直接封装一样,但是,所有名字均在B中可见。 这也是在不提供封装机制的语言中常用的方式。 类属抽象数据类型 语言固有的基本数据类型经常允许程序员声明一类新的数据对象的基本类型,然后规约数据对象的几个属性。这是简单的多态形式。 如,PASCAL提供了基本的数组类型,但也留下了用户可以进一步定义的部分,如下标范围。 Type Vect = array [1..10] of real; 类属抽象数据类型 Ada中整数栈抽象例子 类属抽象数据类型 类属抽象类型定义允许类型的一个属性被分离地规约,从而给出一个基类型定义。使用该属性为参数,进而可从同一个基类型导出几个特殊类型。 它们的结构和基类型类似,但参数可影响抽象类型定义中操作的定义以及类型本身的定义。参数可以是类型名或值。 类属抽象数据类型 Ada中类属栈抽象例子 类属抽象类型定义的实例化 一个类属包定义表示了一个模板,可用于创建特殊的抽象数据类型。这个创建过程称为实例化,通过一组参数的代入。 例:前图类属栈类型定义的实例化: package IntStackType is new AnyStackType(elem= integer); package SetStackType is new AnyStackType(elem= Section); 不同大小的整数栈的声明: Stk1: IntStackType.Stack(100); NewStk: IntStackType.Stack(20); 类属抽象类型定义的实例化 类属类型AnyStackType可以用不同的参数值多次实例化,每次实例化均产生包中类型名Stack的另一个定义。这样当栈在声明中被引用时,有可能是含混的。 Ada中需要将包名放在类型名前作前缀,如: IntStackType.stack或SetStackType.stack 在C++中,用模板来定义类属类: template class type_name class classname class_definition 类属抽象数据类型:实现 类属抽象数据类型通常有直接的实现。实例化时,必须给出参数,编译器使用类属定义为模板,插入参数值,然后编译该定义。 在程序执行过程中,只有数据对象和子程序出现。包定义仅仅作为限制数据对象和子程序可见性的设备,包本身并不出现在运行时。

您可能关注的文档

文档评论(0)

wangyueyue + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档