研究生课程_程序语言设计原理教程_第08章.ppt

上传人:来看看 文档编号:5029903 上传时间:2020-01-29 格式:PPT 页数:23 大小:162.50KB
返回 下载 相关 举报
研究生课程_程序语言设计原理教程_第08章.ppt_第1页
第1页 / 共23页
研究生课程_程序语言设计原理教程_第08章.ppt_第2页
第2页 / 共23页
研究生课程_程序语言设计原理教程_第08章.ppt_第3页
第3页 / 共23页
研究生课程_程序语言设计原理教程_第08章.ppt_第4页
第4页 / 共23页
研究生课程_程序语言设计原理教程_第08章.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《研究生课程_程序语言设计原理教程_第08章.ppt》由会员分享,可在线阅读,更多相关《研究生课程_程序语言设计原理教程_第08章.ppt(23页珍藏版)》请在三一文库上搜索。

1、第8章 抽象与封装,函数和过程是封装的程序实体,它有数据和操作, 规格说明(型构)和过程体,一体使于人们控制复杂性 Pascal统一的嵌套结构不造于大型程序,数据2 sub1- sub10,数据4 sub22 -sub28,数据1 sub11- sub15,数据3 sub16 -sub21,main,续,将相关的数据和操作封装成大模块(若干类型,若干过程/函数) 结构上形成包package或模块 Modula 包是可分别编译。随时连接软件资源,是解决复杂系统的有力手段 包的规格说明和包体显式分开。语义上正好是“作什麽”,“怎麽做”,8.1 模块和包,规格说明和体在表示结构上的分离。有利于修改,

2、维护 封装实现数据隐藏,有利于安全 规格说明是程序包的抽象,有利于复杂系统简化,模块(包)封装数据与操作,它有可控界面,外界不能操纵私有数据引出公有(public包的使用者可见)、私有(private本包所有操作可访问,包外不可见)、保护(protected,包外不可见,但本包的子包可见)概念 包只是以封装手段,可有/可没有逻辑语义 -只有数据无操作,数据块BLOCK DATA(FORTRAN) -只有操作无共享数据如函数包,数学库 -有数据有操作,一口对外可模拟自动机 -有数据有操作,模拟客观世界对象增加程序表达能力 -封装的包可实现复杂的数据类型ADT,Ada 的复数程序包 package

3、 COMPLEX is type NUMBER is record REAL_PART:FLOAT; IMAG_PART:FLOAT; end record; function “+“(A,B: in NUMBER) return NUMBER; function “-“(A,B: in NUMBER) return NUMBER; function “*“(A,B: in NUMBER) return NUMBER; end COMPLEX; package body COMPLEX is endCOMPLEX;,有了这个程序包我们可以编出复数应用程序: with COMPLEX; use

4、COMPLEX; procedure MAIN is COMP_1: NUMBER = (1.0,2.0);-1+2i COMP_2: NUMBER : =(3.0,4.0); - 3+4i W, X,Z: NUMBER; begin W = COMP_1 + COMP_2; -W = 4+6i X = COMP_2 - COMP_1; -X = 2+6i Z = COMP_1 * COMP_2; -Z = -5+10i end MAIN;,8.2 抽象数据类型,数据抽象,数据抽象是抽象数据类型的方法学 定义一组数据集V,以及其上的操作集Op,构成 ADT(Abstract Data Type

5、) T=( V , Op ) -什么和怎么做分开(规格说明和体) -实现数据隐藏(体中声明的数据和操作外界不可见) -分别开发分别编译(可做大程序) -简化复杂性便于调试(利用抽象实现分治) -构造新类型,计算直观方便(面向对象的基础),构造新类型,Swith COMPLEY use COMPLEY; Procedure MAIN is C1:NUMBER is =(1.0,2.0); C2:NUMBER is =(3.0,4.0); W ,X, Z :NUMBER; begin W:=C1+C2; X :=C2-C1; Z :=C1*C2; end MAIN,-,*,+,Number LEX

6、,COMP,构造函数和析构函数,变量类型 V : integer;以类型指明程序对象 变量抽象数据类型, 声明时要指明如何构造 C:NUMBER:=(1.0,2.0) 较简单可用赋初值办法,复杂在运行中由构造函数(constructor)完成 C = ADT_Name() 构造函数(constructor) 和ADT同名 不再使用的程序对象,用析构函数(destructor)显式删除 一般形式是: ADT_Name() 和ADT同名 ADT_Name( ),C语言以文件实现抽象数据类型,C语言4种文件 -头文件“modules.h” 定义宏和类型声明 -主模块“name.c” 给出新类型的数据

7、和操作定义 -其它模块“other.c” 实现头文件中声明 -通过makefile指明各文件关系 make SOMETYPE SOMETYPE:name.o other.o /连续两模块的目标码 文件取名SOMETYPE CC_o SOMETYPE name.o other.o /编译并连成为 SOMETYPE的目标文件 name.o : name.c modules.h /两源文件连成为name.o CC_o name.o name.c /源文件编译后形成目标文件 other.o : other.c modules.h CC_o other.o other.c /SOMETYPE 如预定义的

8、了,8.3 类属,函数是表达式集的抽象、过程是命令集的抽象,类属(generic)是声明集的抽象。 即声明的变量、类型、子程序都是参数化的。 Ada类属子程序: generic type ELEMENT is pravite; -类属类型参数 procedure EXCHANGE (FIRST, SECOND:in out ELEMENT); TEMP:ELEMENT; -程序中用类属形参 begin TEMP = FIRST; FIRST = SECOND; SECOND = FIRST; end EXCHANGE; 关键字procedure换成package即为类属包,参数化类型与实际类型

9、结合。由类属设例指明: procedure INT_EXCHANGE is new EXCHANGE (Integer); 实在的Integer与ELEMENT匹配, 即在procedure中任何出现ELEMENT的地方以Integer代,等于有了整数的 EXCHANGE 如同 样板,可以写出多个过程: procedure CHAR_EXCHANGE is new EXCHANGE ( Character); procedure SMALLINT_EXCHANGE is new EXCHANGE (MY_INT);,8.3.1 类属定义一般形式,generic | | | package GE

10、NERIC_PKG is -用类属参数的包 . . . end GENERIC_PKG; 类属实例化是在有了实在参数以后作实例声明: package INS_PKG is new GENERIC_PKG(); 类属形实参数的个数、 次序要匹配。,类属参数,原则上声明中的所有程序对象都可以参数化,其实现机制如同子程序中参数结合, 类属值一般是复制机制, 类属对象(变量)、类型、子程序用引用机制。 取决于实现。 类属声明是 in 模式变量 可换值 inout模式变量 可换变量 类属类型private 私有 可以和任何类型匹配 () 枚举 可以和任何枚举类型匹配 range 整 可以和任何整型匹配

11、delta 定点 可以和任何定点类型匹配 digits 浮点 可以和任何浮点类型匹配 类属子程序with procedure() 可以和任何过程匹配,同时类型参数例化, Ada的类属程序包的例子 程序包中封装一分类和归并程序。被分数据按数组类型设计, 它的元素类型,按升序还是降序,数组下标,都参数化: generic type ITEM is private -数组元素类型参数化 type SEQUENCE is array (Integer range ) of ITEM; -数组类型参数化。ITEM马上就用了 with function PRECEDES (x,y:ITEM ) retur

12、n Boolean; -参数化操作未定升降序 package SORTING is procedure SORT (S: in SEQUENCE); procedure MERGE (S1, S2: in SEQUENCE; S: out SEQUENCE); end SORTING;,有两个实在函数: function “=“ (X,Y: Float) return Boolean; 那么就可以作以下设例声明: type FLPAT_SEQUENCE is array (Integer range ) of Float; package ASCENDING is new SORTING(Fl

13、oat,FLOAT_SEQUENCE,“=“); 这样, 就有了一个升序, 一个降序的两个程序包。,续,类属动态实现问题,类属程序是抽象程序可以编译,但不可执行,每次执行的是实例程序。其编译执行如同C语言之宏替换,也就是参数静态束定于实参,强类型语言可以做到。 类属程序只有一个,运行时动态束定就不需要显式设例。 因此,动态设例的程序表达能力更强,程序易于扩充。,8.4 类和对象,包充作程序对象 with SYSTEM; package STACK is function PUSH (k:Integer) return Boolean; function POP return Integer;

14、function TOP return Integer;-返回栈顶元素 end STACK; package body STACK is STKLEN : constant:=10; -堆栈有十元素 STK:array (1STKLEN) of Integer; -整数堆栈体 TOS: Integer range 1STKLEN;,function PUSH (k:Integer) is begin if TOS 0 then return STK(TOS); else return SYSTEM.MIN_INT; -交SYSTEM包处理 endif; end TOP,function POP

15、 return Integer is ANS:Integer; -工作变量局部量 begin ANS:= TOS; TOS:= TOS - 1; return ANS; end POP; begin -程序包是资源,以下执行代码在装入后, TOS:=0 -程序运行时首先执行,为了初始化。 end STACK; 这个对象是实例对象,可以对它施行堆栈操作 stack.PUSH(N); stack.pop; stack.top; 包名充作实例对象名。,类对象生成实例对象,C+的类定义 class char_stack /以下是该类的私有部分 int size; char * tos, *end; c

16、har * s; public: /以下是该类公共部分 char_stack(int sz) s = new char size = sz; tos = s; end = tos + (size - 1); char_stack( ) delete s; int push (char c) return (tos s ? * - tos:); char top( ); /top的声明 ; /类定义结束 char char_stack:top( ) /top的定义 return (tos s ? * tos : ); ,相应主程序 main( ) char c; char_stack stk1(

17、100);/构造子,形同类型说明 char_stack stk2(10); stk3 = new char_stack (20); stk1.push ( #); /向Stk1发push消息 stk2.push (%); c = stk2.pop( ); ,续,.类、类型、抽象数据类型 同异 -都是(A,Op)值集和值上的操作集,在这个意义上, 它们通用 C+ 按此处理 -类型和抽象数据类型都是类型。如同人和黑人 都是人,类型沿用历史理解是基元类型+简单结构类型 (预定义)抽象数据类型类型是用户可以用基本类型构造 复杂类型(用户定义) -类和抽象数据类型都是在类型体系结构上定义操作集, 类是用户定义的程序对象的概括抽象。程序对象是封装的 自主的,主动实施类中定义的操作,加工私有数据。抽象 数据类型只说明程序对象的类型,被动地接受该类型允许 的操作。 . ADT:V 抽象数据类型的变量(名) C:V 类的实例对象(名) .() OP1(V) V是该类型值的引用 V.OP1 V是实例对象名,不涉及值 -类/类型和子类/子类形差异更大 子类是类的特化内涵增加 子类型是类型的子集内涵所小,外延都减小,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1