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

上传人:laozhun 文档编号:2424529 上传时间:2023-02-18 格式: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统一的嵌套结构不造于大型程序,数据2sub1-sub10,数据4sub22-sub28,数据1sub11-sub15,数据3sub16-sub21,main,续,将相关的数据和操作封装成大模块(若干类型,若干过程/函数)结构上形成包package或模块 Modula包是可分别编译。随时连接软件资源,是解决复杂系统的有力手段包的规格说明和包体显式分开。语义上正好是“作什麽”,“怎麽做”,8.1 模块和包,规格说明和体在表示结构上的分离。有利于修改,维护 封装实现数据隐藏,

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

3、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 COMPLEX;procedure MAIN is COMP_1:NUMBER=(

4、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)T=(V,Op)-什么和怎么做分开(规格说明和体)-实现数据隐藏(体中声明的数据和操作外界不可见)-分别开发分别编译(可做大程序)-简化复杂性便于调试

5、(利用抽象实现分治)-构造新类型,计算直观方便(面向对象的基础),构造新类型,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,-,*,+,NumberLEX,COMP,构造函数和析构函数,变量类型 V:integer;以类型指明程序对象变量抽象数据类型,声明时要指明如何构造C:NUMBER:=(1.0,2.0)较简单可用赋初值办法,复杂在运行中由构造函数(

6、constructor)完成 C=ADT_Name()构造函数(constructor)和ADT同名不再使用的程序对象,用析构函数(destructor)显式删除一般形式是:ADT_Name()和ADT同名 ADT_Name(),C语言以文件实现抽象数据类型,C语言4种文件-头文件“modules.h”定义宏和类型声明-主模块“name.c”给出新类型的数据和操作定义-其它模块“other.c”实现头文件中声明-通过makefile指明各文件关系 make SOMETYPE SOMETYPE:name.o other.o/连续两模块的目标码 文件取名SOMETYPE CC_o SOMETYPE

7、 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.3 类属,函数是表达式集的抽象、过程是命令集的抽象,类属(generic)是声明集的抽象。即声明的变量、类型、子程序都是参数化的。Ada类属子程序:generic type ELEMENT is pravite;-类属类型参数 procedure EXCH

8、ANGE(FIRST,SECOND:in out ELEMENT);TEMP:ELEMENT;-程序中用类属形参 begin TEMP=FIRST;FIRST=SECOND;SECOND=FIRST;end EXCHANGE;关键字procedure换成package即为类属包,参数化类型与实际类型结合。由类属设例指明:procedure INT_EXCHANGE is new EXCHANGE(Integer);实在的Integer与ELEMENT匹配,即在procedure中任何出现ELEMENT的地方以Integer代,等于有了整数的 EXCHANGE 如同样板,可以写出多个过程:pro

9、cedure CHAR_EXCHANGE is new EXCHANGE(Character);procedure SMALLINT_EXCHANGE is new EXCHANGE(MY_INT);,8.3.1 类属定义一般形式,generic|package GENERIC_PKG is-用类属参数的包.end GENERIC_PKG;类属实例化是在有了实在参数以后作实例声明:package INS_PKG is new GENERIC_PKG();类属形实参数的个数、次序要匹配。,类属参数,原则上声明中的所有程序对象都可以参数化,其实现机制如同子程序中参数结合,类属值一般是复制机制,类属

10、对象(变量)、类型、子程序用引用机制。取决于实现。类属声明是 in 模式变量 可换值 inout模式变量 可换变量类属类型private 私有 可以和任何类型匹配()枚举 可以和任何枚举类型匹配 range 整 可以和任何整型匹配 delta 定点 可以和任何定点类型匹配 digits 浮点 可以和任何浮点类型匹配类属子程序with procedure()可以和任何过程匹配,同时类型参数例化,Ada的类属程序包的例子 程序包中封装一分类和归并程序。被分数据按数组类型设计,它的元素类型,按升序还是降序,数组下标,都参数化:generic type ITEM is private-数组元素类型参数

11、化 type SEQUENCE is array(Integer range)of ITEM;-数组类型参数化。ITEM马上就用了 with function PRECEDES(x,y:ITEM)return 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 FL

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

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

14、n SYSTEM.MIN_INT;-交SYSTEM包处理 endif;end TOP,function POP 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/以下是

15、该类的私有部分 int size;char*tos,*end;char*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(100);/构造子,形同类型说明

16、 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备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号