北航研究生课程程序语言设计原理教程第10章.ppt_第1页
北航研究生课程程序语言设计原理教程第10章.ppt_第2页
北航研究生课程程序语言设计原理教程第10章.ppt_第3页
北航研究生课程程序语言设计原理教程第10章.ppt_第4页
北航研究生课程程序语言设计原理教程第10章.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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。10050消息带参数50发向对象100,得(100,50)(sum/count)*reserveamount双目,括号优先单目优先双目,关键字消息表达式用关键字(带有:的选择子)描述的双目表达式,也是自左至右释义。anArrayat:3put:100financestotalSpentOn:food赋值变量在不同时间可赋以不同对象,任何表达式加上赋值前缀chapter1。fooarrayat:4。数组第4元素与foo同名,块表达式:x:yBicPengoto:xy:x:yBicPengoto:xyvalue:100value:250BicPengoto100250aBlockaBlockThisisaStringdisplayAt:500500.Displaywhite.aBlockvalue,(6)控制结构条件选择一般形式是:布尔子表达式ifTrue:真块执行ifFalse:假块执行“可以不出现”如:numberlistSizewhileFalse:listat:indexput:0。indexindex+1,(7)消息/方法消息模式|临时变量|语句组nawAt:initialLocationnewBoxnewBoxselfnew.newBoxsetLoc:initiaPLocationtilt:0size:100scribe:pennew.newBoxshow.setLoc:newLoctilt:newTiltsize:newSizeseribe:newScribeLocnewLoc.titlnewTilt.sizenewSize.scribenewScribe,Smalltalk是编译解释执行的,Smalltalk源程序经编译器得到虚映象(Virtualimage),虚映象由字节代码中间语言编写,由Smalltalk虚机解释执行。相应的文件系统管理三种文件:源文件、变更文件、映象文件。由于Smalltalk是交互式的,被编译的方法在执行期间出了问题要反应到源程序,则要对映象文件施行反编译(decompliation)Smalltalk的虚机是一个新软件,它有三个功能部分:存储管理器虚映象解释器基本例程用汇编码写出的底层方法实现,10.1.4Smalltalk文件系统与虚机,10.1.5Smalltalk程序设计范型,程序设计在类的层次上进行,由类静态(于工作空间指明向类发出消息)或动态(方法运行时)生成实例对象。每个对象当接受某消息并执行其方法的消息表达式时都是在自向其它对象发消息。,一个简单的Smalltalk程序,统计字母出现频率sf“定义了两个临时变量”sPrompterprompt:enterlinedefault:.“s是Prompter的实例,将关键字表达式的结果束定于s”“意即输入一行字符串,若不输入,S为空串”fBagnew.“f是Bag的实例”sdo::ccisLetterifTure: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:stringsize;|scfk|k,i:Integer;“定义了四个临时变量”c:Char;f:ARRAY1.26OFInteger;fArraynew:26.BEGIN“f是Arrey实例长度26”Writeln(enterline);sPrompterReadIn(s);prompt:enterlineFORi:=1TO26DOdefault:.fi:=0;“S是Prompter的实例,装输入字串”FORi:=1TosizeDO1to:26do:I|fat:Iput:0.BEGIN1to:sizedo:I|c:=aslowerCase(si);c(sat:i)asLowerCase.ifisLetter(c)THENcisLetterifTrue:BEGINkcasciiValuek:=ord(c)-ord(a)+1;-aasciiValue+1.fk:=fk+1fat:kput:(fat:k)+1ENDEND;.FORi:=1To26DOfWrite(fi,)END.,类协议,一个完整的Smalltalk程序,家庭财务帐目建立全部流水帐类,直接挂在Object上classnameFinancialHistorysuperclassObjectinstancevariablenamescaseOnHandincomesexpenditurescategoryFinancialToolsclassmethodinitialBalance:amount“建立流水帐本初始为amount(元)”supernewsetinitialBalance:amounTnew“建立流水帐本初始为0(元)”supernewsetinitialBalance:0instancemethodreceive:amountfrom:sourceincomesat:sourceput:lselftotalReceivedFrom:source)+amount.“从来源source接收到的钱数,因而手头现金增加”.cashOnHandcashOnHand+amount.incomeschangedspend:amountfor:reason“为事由reason支付的钱数,因而手头现金减少。”expendituresat:reasonput:(selftotalSpentFor:reason)+amount.,cashOnHandcashOnHand-amount.expenditureschangedCashOnHand“回答当前手头现金”cashOnHandexpenditures“回答支出细目”expendituresincomes“回答收入细目”incomestotalReceiveFrom:source“回答自source收钱总数”(incomesincludesKey:source)ifTrue:incomesat:sourceifFalse:0totalSpentFor:reason“回答在reason项上总支出”(expendituresincludesKey:reason)ifTrue:expendituresat:reasonifFalse:0privateSetlnitialBalance:amount“实例变量初始化”cashOnHandamount.incomesDictionarynew.expendituresDictionarynew,Smalltalkat:#HouseholdFinancesput:nil.HouseholdFinancesFinancealHistoryinitialBalance: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类,部分程序是:classemployeecharname,soc_sec13,*dept_code,*job_codepublic:employee*Link;employee(int);/构造函数;变元是名字个数voidprint_paycheck;virtualpay_datacompute_pay;virtualvoidprint_list;voidemployee:print_empl()coutName:namentsoc_sectDept:dept_codetJob:job_coden;classsalaried:publicemployeeintannual_salary,vocation_used;public:pay_datacomput_pay();voidtake_vacation();,classmanager:salariedemployee*staff;public:voidadd_employee();voidprint_list();voiddo_payroll();manager();/构造函数;classhourly:publicemployeefloatpay_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=scanlink)voidmanager:print_list()coutnnManager:;print_empl();cout0ADDTOQ(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的类和程序运行,classQUEUEITEMinheritOBJECT-可以多个父类3creationmake-只指明构造特征的名字5featureNONE-私有特征size:INTEGERhead:NODEITEM-引用QUEUE类外的类型NODE8tail:NODEITEM,9featureAN公有特征10make(n:INTEGER)is-构造n结点实例对象,只记-n和当前长度dosize:=nlength:=0-当前长度为014end-make15front:ITEMis-取队前端数据项require-前置条件关键字notis_empty-队不空doResult:=head.item20end_front,21add(i:ITEM)is-在队尾处加一项require23notis_full24localnew_node:NODEITEMdo27!New_node.make(i)28ifhead=Voidthenhead:=new-nodeelsetail.Change_next(new_node)endtail:=new_nodelength:=length+135endsure-后置条件关键字tail=new_nodelength=Old(length)+139end-add,40removeis-取消队头项(结点)requirenotis_emptydohead:=head.nextifhead=Voidthentail:=headendlength:=lenght-1ensure-后置条件end-remove,52is_empty:BOOLEANis-查队是否空doResult:=(length=0)end-is-empty56is_full:BOOLEANis-查队是否满doResalt:=(length=size)end-is_full60length:INTEGERend-classQUEUE,q:QUEUEsSTRING63!q.make(10)64fromj:=0-循环初值untilj:=10-循环终值68loopj:=j+1io.read_lines:-io,last_lines:-io.last_line72q.add(s)73end,查找数组a(索引从1到size)中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论