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

上传人:sh****n 文档编号:6827637 上传时间:2020-03-05 格式:PPT 页数:60 大小:405KB
返回 下载 相关 举报
北航研究生课程程序语言设计原理教程第10章.ppt_第1页
第1页 / 共60页
北航研究生课程程序语言设计原理教程第10章.ppt_第2页
第2页 / 共60页
北航研究生课程程序语言设计原理教程第10章.ppt_第3页
第3页 / 共60页
点击查看更多>>
资源描述
第10章面向对象程序设计语言 当今席卷软件界的面向对象技术 近因是xerox公司1980年推出的Smalltalk 80语言 10 1Smalltalk语言对象的思想最早源于人工智能研究 60年代末描述智能对象的框架 frame 即封装了许多槽 slot 槽既可以是属性 数据 也可以是行为 操作 和 约束 但最早见诸文献是sketchpad提到的OO图形学 1963 60年代挪威的Dahl和Nyard为模拟系统研制了SIMULA 67语言 首先提出封装的类和动态生成实例对象的概念 60年代末 美国犹他大学AlanKay到Xerox公司PaloAlto研究中心参加了Dynabook项目 该项目的硬件是Star 个人机的前驱 软件是Smalltalk 1972年DanIngalls完成Smalltalk 72第一个实用版 以后又经过 76 80两次改进 Smalltalk 80成为向外发行的正式版本 10 1 1Smalltalk系统 语言核心 Kernel 程序设计系统 程序设计范型 Paradigm 用户界面模型 UserInterfaceModel 10 1 2用户界面模型 系统工作空间 SystemWorkSpace 工作空间 WorkSpace 系统副本 SystemTranscript 项目 Project 两种图形编辑窗 Form和Bit 系统浏览器 SystemBrowser 窗 用户就是按浏览窗中显示的模板填写程序 10 1 3语言核心 1 保留字只有五个nil true false self super 2 字面量字符字面量 数字面量 符号字面量 数组字面量 3 限定符和特殊符号 或 4 变量实例变量 类变量 临时变量 全局变量 汇聚变量 参数 5 消息表达式与语句 消息表达式的一般格式是 对象选择子参数Smalltalk的消息表达式有三种 单目的不带参数treeclass消息class发向tree 得到tree的类 0 3sin消息sin发向0 3 得sin 0 3 Arraynew消息new发向Array 创建 Array的实例 对象 选择子 参数 双目的3 4消息 带参数4发向对象3 得对象7 100 50消息 带参数50发向对象100 得 100 50 sum count reserveamount双目 括号优先单目优先双目 关键字消息表达式用关键字 带有 的选择子 描述的双目表达式 也是自左至右释义 anArrayat 3put 100financestotalSpentOn food 赋值变量在不同时间可赋以不同对象 任何表达式加上赋值前缀 quantity 19 name chapter1 foo arrayat 4 数组第4元素与 foo 同名 块表达式 x y BicPengoto x y x y BicPengoto x y value 100value 250BicPengoto100 250 aBlock aBlock ThisisaString displayAt 500 500 Displaywhite aBlockvalue 6 控制结构条件选择一般形式是 布尔子表达式ifTrue 真 块执行 ifFalse 假 块执行 可以不出现 如 numberlistSize whileFalse listat indexput 0 index index 1 7 消息 方法消息模式 临时变量 语句组nawAt initialLocation newBox newBox selfnew newBoxsetLoc initiaPLocationtilt 0size 100scribe pennew newBoxshow setLoc newLoctilt newTiltsize newSizeseribe newScribe Loc newLoc titl newTilt size newSize scribe newScribe Smalltalk是编译 解释执行的 Smalltalk源程序经编译器得到虚映象 Virtualimage 虚映象由字节代码中间语言编写 由Smalltalk虚机解释执行 相应的文件系统管理三种文件 源文件 变更文件 映象文件 由于Smalltalk是交互式的 被编译的方法在执行期间出了问题要反应到源程序 则要对映象文件施行反编译 decompliation Smalltalk的虚机是一个新软件 它有三个功能部分 存储管理器 虚映象解释器 基本例程用汇编码写出的底层方法实现 10 1 4Smalltalk文件系统与虚机 10 1 5Smalltalk程序设计范型 程序设计在类的层次上进行 由类静态 于工作空间指明向类发出消息 或动态 方法运行时 生成实例对象 每个对象当接受某消息并执行其方法的消息表达式时都是在自向其它对象发消息 10 1 5 1一个简单的Smalltalk程序 统计字母出现频率 sf 定义了两个临时变量 s Prompterprompt enterline default s是Prompter的实例 将关键字表达式的结果束定于s 意即输入一行字符串 若不输入 S为空串 f Bagnew f是Bag的实例 sdo c cisLetterifTure fadd casLowerCase s在Prompter中找方法do 的模式 若找不到 找prompter的 父类直到Object C是块变量 意从S中拿出某字符 isLetter 是消息模式 判C是否字符 若为真执行内块 内块中f找add 消息模式 从Bag直至上层父类 找到先执 行右边子表达式 casLowerCase是单目表达式 同样要在Prompter中找asLowerCase匹配 也是不成向上找 它返回是 第k个 小写字母 add 把它发送到对象f的第k个位置上并与原数相加 f 返回f中的值 这个程序一共四句 如果掀鼠标使菜单项 doit 工作并输入 SmalltalkisaprogrammingLanguagefordevelopingsoluionstobothsimpleandcomplexproblem 则输出的f值是 71124151517447336321abcdefghiklmnoprstuv 例字频统计对比程序PascalSmalltalkPROGRAMFrequency 无消息模式方法 宜写算法 CONSTSize 80 VARs string size scfk k i Integer 定义了四个临时变量 c Char f ARRAY 1 26 OFInteger f Arraynew 26 BEGIN f是Arrey实例长度26 Writeln enterline s PrompterReadIn s prompt enterline FORi 1TO26DOdefault f i 0 S是Prompter的实例 装输入字串 FORi 1TosizeDO1to 26do I fat Iput 0 BEGIN1to sizedo I c aslowerCase s i c sat i asLowerCase ifisLetter c THENcisLetterifTrue BEGINk casciiValuek ord c ord a 1 aasciiValue 1 f k f k 1fat kput fat k 1END END FORi 1To26DO fWrite f i END 10 1 5 2类协议 10 1 5 3一个完整的Smalltalk程序 家庭财务帐目建立全部流水帐类 直接挂在Object上classnameFinancialHistorysuperclassObjectinstancevariablenames caseOnHandincomesexpenditures category FinancialTools classmethodinitialBalance amount 建立流水帐本初始为amount 元 supernewsetinitialBalance amounTnew 建立流水帐本初始为0 元 supernewsetinitialBalance 0instancemethodreceive amountfrom source incomesat sourceput lselftotalReceivedFrom source amount 从来源source接收到的钱数 因而手头现金增加 cashOnHand cashOnHand amount incomeschangedspend amountfor reason 为事由reason支付的钱数 因而手头现金减少 expendituresat reasonput selftotalSpentFor reason amount cashOnHand cashOnHand amount expenditureschangedCashOnHand 回答当前手头现金 cashOnHandexpenditures 回答支出细目 expendituresincomes 回答收入细目 incomestotalReceiveFrom source 回答自source收钱总数 incomesincludesKey source ifTrue incomesat source ifFalse 0 totalSpentFor reason 回答在reason项上总支出 expendituresincludesKey reason ifTrue expendituresat reason ifFalse 0 privateSetlnitialBalance amount 实例变量初始化 cashOnHand amount incomes Dictionarynew expenditures Dictionarynew Smalltalkat HouseholdFinancesput nil HouseholdFinances FinancealHistoryinitialBalance 1560HouseholdFinancesspend 700for rent NouseholdFinancesspend 78 53for food HouseholdFinancesreceive 820from pay HouseholdFinancesreceive 22 15from interest HouseholdFinancesspend 135 65for utilities HouseholdFinancesspend 146 14for food 10 1 6Smalltalk程序设计系统 在Smalltalk中 系统支持程序也是作为类挂在Object之下 包括算术运算 数据和控制结构的实现 输入 出 随机数生成器等 有一些类是辅助程序设计过程的 语法分析器 编译器 解释器 反编译器这些对象的方法都有源代码 目标码两种形式 还有一些对象表示类和方法的结构 以便程序员追踪系统 还有将方法和向其发消息的对象联结起来的对象 这些对象统称环境 contexts 类似其他语言实现中的堆栈帧和活动记录 10 2Smalltalk的对象 类 方法的实现类的存储 实例对象的存储实例对象只存放数据 其存储格式如下图 活动记录 环境部分 指令部分 发送者部分 10 3面对象的基本特征 P Wegner总结了OO语言的发展 给出以下图示澄清了概念 封装 对象 数据和操作 局部性 可维护性抽象 类概括描述 简单性继承 类体系可重用性多态 重载 类属可扩充性动态束定 面向对象可交互性基于对象的语言基于类的语言面向对象语言Ada83 ActorCLUSmalltalk Eiffelsimula67C Ada95 Java 传统老语言纷纷转向OO 这里面分三种情况 以老语言模拟Smalltalk 下层则可利用老语言的资源 代表是Objective C 改造老语言 在原有风格基础上增加对象 类机制 尽可能全面反映上述五大特征 代表是C Ada95以及ObjectCOBOL ObjectPaseal ObjectFORTH 这是多范型语言之路 按上述五大特征设计全部的强类型面向对象语言 典型的是Eiffel 它虽然纯正 但脱离了原有环境资源支持 推广需要时日 封装与继承带来的问题 访问权限C 类继承方式子类公有Public公有公有Private私有保护Public私有 仍受保护 保护Private不继承私有Public不继承私有Private不继承 对象初始化次序derived derived inti intj intk basel i base2 j d k 第一基类构造函数 第二基类构造函数缺省构造函数是先基后派对缺省的析构子其调用次序相反 先派后基 强类型语言的动态多态问题C 的无法执行的多态函数设父类ellipse子类eircle均有求周长求面积area 函数 有以下主程序 main ellipse pe e 8 0 4 0 eirclec 5 0 pe 实现办法是建立一个虚函数表记下本函数在各子类中的位移 当pe代表不同子类对象时 可以准确找到要计算的函数 计算并打印职工工资表设经理 专业人员 行政人员领年薪 其它雇员领计时工资 其类继承体系是 若前此已设计card pay data类 部分程序是 classemployee charname soc sec 13 dept code job codepublic employee Link employee int 构造函数 变元是名字个数voidprint paycheck virtualpay datacompute pay virtualvoidprint list voidemployee print empl cout Name name n t soc sec tDept dept code tJob job code n classsalaried publicemployee intannual salary vocation used public pay datacomput pay voidtake vacation classmanager salaried employee staff public voidadd employee voidprint list voiddo payroll manager 构造函数 classhourly publicemployee floatpay rate hours worked overtime intvacation used public pay datacompute pay voidrecord time card card hourly 构造函数 classofficer salaried classprofessional salaried 其中employee print list 定义为虚函数 manager print list 也是虚函数 它们的各自定义是 voidemployee print list employee scan for scan link scan NULL scan scan link voidmanager print list cout n nManager print empl cout nEmployeesSupervised n employee print list 10 4Ada的面向对象机制 定义类和实例对象Ada95以抽象数据类型实现类 类的封装性由包实现 类的继承性则扩充了标签 tag 类型和抽象类型 标签类型只限记录类型 类的继承性利用了Ada8的类型派生机制实现子类 packageObjectistypeObjectistagged 此类型的数据即对象的属性record 无tagged即一般的ADT 有它是为了类继承X Coord Float 0 Y Coord Float 0 初值为缺省时用endrecord functionDistance O Object returnFloat Object对象的行为functionArea O Object returnFloat endObject withObject useObject packageShapesis 这个包封装了三个子类 型 typePointisnewObjectwithnullrecord 只继承不扩充的子类typeCircleisnewObjectwith 继承并扩充此属性recordRadius Float endrecord functionArea C Circle returnFloat 覆盖Object中的AreatypeTriangleisnewObjectwith 继承并recordA B C Float 扩充三个属性endrecord functionArea T Triangle returnFloat 覆盖endShape 这些类 型 包外可见 可输出 在主子程序中声明实例 如同类型声明变量 以初值表达式作值构造子 子类的实例也是父类的实例O Object P Point 声明实例对象P Owithnullrecord C Cirele 0 0 0 0 34 7 C Owith34 7 T Triangle 3 0 4 0 5 0 T Owith3 0 4 0 5 0 如果动态生成实例 可将此声明放在类的方法 过程 函数 中 调用时生成 以类宽类型实现多态 Ada95的每个标签类型都有一个与之对应的类类型属性T Class 并把它叫做类宽类型 ClassWideType 设已声明T类型 及T Class的变量V 则Y T 一般声明 正确Y T Class 不可以Y T Class V 可以 T Class束定为V的类型类宽类型的范围示意如下 procedureProcess Reservation Rc inoutReservation Class is 形参可以是类宽类型 不必最初束定某特定类型begin Make Rc 它按相结合的Rc的具体类型出票 endProcess Reservation 这个程序在编译时Make是没有也无法束定到某make函数体上 只有在运行中 动态 束定 束定时按Rc对应的实参的标签tag值派送 编译时只要做出派送表 扩充程序包机制实现继承的类体系 Ada95增设了子辈单元 childunit 和私有子辈单元 子辈单元packageReservation System Supersonicis 后是子辈单元名typeSupersonic ReservationisnewReservationwithprivate privatetypeSupersonic ReservationisnewReservationwithrecordChampagne Vintage endrecord procedureMake Sr inoutSupersonic Reservation procedureSelect Seat Sr inoutSupersonic Reservation endReservation System Supersonic 私有子辈单元packageOSis 父包OS OS的可见成份typeFile Descriptorisprivate privatetypeFile DescriptorisnewInteger endOS packageOS Exceptionsis OS的子辈程序包File Descriptor Error File Name Error Permission Error exception 所定义异常OS各子辈包均可用endOS Exceptions 公有 但不涉及泄露withOS Exceptions withOS Exceptions packageOS File Manageris OS的子辈程序包typeFile Modeis Read Only Write Only Read Write functionOpen File Name String Mode File Mode returnFile Descriptor procedureClose File inFile Descriptor endOS File Manager 公有 只用私有类型 也无泄露withOS Exceptions procedureOS Interpret Command String 命令解释过程 等同子包privatepackageOS Internalsis 私有子辈程序包 不用with endOS Internals privatepackageOS Internals Debugis OS的私有子辈程序包 endOS Internals Debug Ada的多继承withAbstract Sets packageLinked SetsistypeLinked SetisnewAbstruct Setswithprivate 再定义Linked Set的各种操作privatetypeCell typeCell PtrisaccessCell typeCellisrecordE Element next Cell Ptr endrecordfunctionCopy P Cell Ptr returnCell Ptr typelnnerisnewControlledwithrecordThe Set Cell Ptr endrecord procedureAdjuse Obj inoutlnner typeLinked SetisnewAbstract Setswith 继承Abstraet setsrecordComponent lnner 其扩展成分又继承了Controlledendrecord endLinked Sets 10 5Eiffel的对象 Eiffel有传统语言的赋值 变量 控制 三种 函数 过程 调用 参数匹配 类属 异常等概念和机制 它在这些概念与机制之上定义类和对象 Eiffel把类和类型同等看待 类是抽象数据类型的实现类型分为两种 一为尽头 expended 类型 这就是其它语言中的基元类型 引用 referance 类型 有了类型就可以声明实体 entity P PERSON 实体P引用PERSON类 型 Eiffel中的实例对象没有名字 但可借助实体 并可在执行中生成 P双惊叹号即创建指令 创建一PERSON类的实例对象 I INTEGER 实体I就是尽头类型INTEGER的实例不用双惊叹号 就是实例对象声明 抽象数据类型nameQUEUE I includeLISTSsortI Q B NsignatureCREATEQ N QFRONTOFQ Q IADDTOQ Q I QREMOVEFROMQ Q QISEMPTYQ Q BISFULLQ Q BLENGTHOFQ Q Nsementicsleti I q r Q n N b B pre conditionsCREATEQ n n 0ADDTOQ q i notISFULL q 括号中逗号表示分开的输入FRONTOFQ q notISEMPTY q REMOVEFROMQ q notISEMPTY q ISEMPTYQ q trueISFULLQ q tueLENGTHOFQ q true post conditionsCREATEQ n r r CREATELIST n 括号中的分号表示前面是输入 后面是输出参数ADDTOQ q i r r APPEND q i FRONTOFQ q i i HEAD q REMOVEFROMQ q r r TAIL q ISEMPTYQ q b b ISEMPTYLIST q ISFULLQ q b b ISFULLLIST q LENGTHOFQ q n n LENGTH q end Eiffel的类和程序运行 classQUEUE ITEM inheritOBJECT 可以多个父类 3 creationmake 只指明构造特征的名字 5 feature NONE 私有特征size INTEGERhead NODE ITEM 引用QUEUE类外的类型NODE 8 tail NODE ITEM 9 feature AN 公有特征 10 make n INTEGER is 构造n结点实例对象 只记 n和当前长度dosize nlength 0 当前长度为0 14 end make 15 front ITEMis 取队前端数据项require 前置条件关键字notis empty 队不空doResult head item 20 end front 21 add i ITEM is 在队尾处加一项require 23 notis full 24 localnew node NODE ITEM do 27 New node make i 28 ifhead Voidthenhead new nodeelsetail Change next new node endtail new nodelength length 1 35 endsure 后置条件关键字tail new nodelength Old length 1 39 end add 40 removeis 取消队头项 结点 requirenotis emptydohead head nextifhead Voidthentail headendlength lenght 1ensure 后置条件end remove 52 is empty BOOLEANis 查队是否空doResult length 0 end is empty 56 is full BOOLEANis 查队是否满doResalt length size end is full 60 length INTEGERend classQUEUE q QUEUEs STRING 63 q make 10 64 fromj 0 循环初值untilj 10 循环终值 68 loopj j 1io read lines io last lines io last line 72 q add s 73 end 查找数组a 索引从1到size 中 v值第一次出现的位置 fromposition 0s a item 1 invariant 不变式0 positionandposition sizevariant 变式size positionuntilposition sizeorelsev a item position loopposition position 1end Eiffel的继承与多态 被继承特征可换名 被继承特征可改变可见性 被继承特征可重新定义行为 可以使被继承特征的行为延迟发生作用 选择继承 被继承特征不作定义 classHEIRinheritPARENT1 无适配子句全部继承此父类特征PARENT2renamef1asparent2 f1 将PARENT2中的f1换成后者f2asparent2 f2export 改变输出 外部可见 状态 ANY f3 parent2 f1 PARENT2中f3 f1在此类中公有 NONE f4 parent2 f2 PARENT2中f4 f2在此类中私有 ACLASS f5 只许ACLASS使用redefine 内容有了修改的关键字parent2 f1 f3undefine 被覆盖的关键字f4 parent2 f2 select 在同名特征中先定继承路径end 继承来的PARENT2使用5种适配子句PARENT3renameg1asparent3 g1end 只选一种适配子句表示有了修改creation 本类构造子feature 本类定义的特征end classHEIR 指定动态类型和动态束定 指定动态类型P PERSON EMPLOYEE p make p的静态类型仍然是PERSON 用它创了一个EMPLOYEE类型的对象 运行中执行的是 e EMPLOYEE e MAKE 两个make是不同的特征 动态束定Eiffel中可以写指令 plist item display其中display在各子类 型 中定义同名 但例程不一样 执行时可按item当前类 型 找出它的display特征执行 即动态束定
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!