第04章面向对象程序设计语言.ppt
《第04章面向对象程序设计语言.ppt》由会员分享,可在线阅读,更多相关《第04章面向对象程序设计语言.ppt(82页珍藏版)》请在三一办公上搜索。
1、第04章 面向对象程序设计语言,4.1 Smalltalk语言对象的思想最早源于人工智能研究,60年代末描述智能对象的框架(frame)即封装了许多槽(slot),槽既可以是属性(数据)也可以是行为(操作)和(约束)。但最早见诸文献是sketchpad提到的OO图形学(1963)。60年代挪威的Dahl和Nyard为模拟系统研制了SIMULA-67语言,首先提出封装的类和动态生成实例对象的概念。60年代末,美国犹他大学Alan Kay到Xerox公司PaloAlto研究中心参加了Dynabook项目。该项目的硬件是Star(个人机的前驱)软件是Smalltalk。1972年Dan Ingall
2、s完成Smalltalk-72第一个实用版,以后又经过-76-80两次改进,Smalltalk-80成为向外发行的正式版本。,4.1 Smalltalk语言对象的思想最早源于人工智能研究,60年代末描述智能对象的框架(frame)即封装了许多槽(slot),槽既可以是属性(数据)也可以是行为(操作)和(约束)。但最早见诸文献是sketchpad提到的OO图形学(1963)。60年代挪威的Dahl和Nyard为模拟系统研制了SIMULA-67语言,首先提出封装的类和动态生成实例对象的概念。60年代末,美国犹他大学Alan Kay到Xerox公司PaloAlto研究中心参加了Dynabook项目。
3、该项目的硬件是Star(个人机的前驱)软件是Smalltalk。1972年Dan Ingalls完成Smalltalk-72第一个实用版,以后又经过-76-80两次改进,Smalltalk-80成为向外发行的正式版本。,4.1.1 Smalltalk系统,语言核心(Kernel)程序设计系统程序设计范型(Paradigm)用户界面模型(User Interface Model),4.1.2 用户界面模型,系统工作空间(System WorkSpace)工作空间(WorkSpace)系统副本(System Transcript)项目(Project)两种图形编辑窗(Form和Bit),系统浏览器
4、(System Browser)窗,用户就是按浏览窗中显示的模板填写程序。,4.1.3 语言核心,(1)保留字只有五个nil,true,false,self,super(2)字面量字符字面量/数字面量/符号字面量/数组字面量(3)限定符和特殊符号#(),;::=或()(4)变量实例变量/类变量/临时变量/全局变量/汇聚变量/参数,(5)消息表达式与语句,消息表达式的一般格式是:对象 选择子 参数Smalltalk的消息表达式有三种:单目的 不带参数 tree class 消息class 发向tree,得到tree的类。0.3 sin 消息sin 发向0.3,得sin(0.3)Array new
5、 消息new 发向Array,创建-Array 的实例,对象,选择子-参数,双目的 3+4 消息+带参数4发向对象3,得对象7。100 50 消息带参数50发向对象100,得(100,50)(sum/count)*reserve amount 双目,括号优先 单目优先 双目,关键字消息表达式用关键字(带有:的选择子)描述的双目表达式,也是自左至右释义。anArray at:3 put:100finances totalSpentOn:food赋值 变量在不同时间可赋以不同对象,任何表达式加上赋值前缀 quantity19.namechapter 1。foo array at:4。数组第4元素与
6、foo同名,块表达式:x:yBicPen goto:xy:x:yBicPen goto:xy value:100 value:250 BicPen goto 100 250 aBlock aBlockThis is a String displayAt:500 500.Display white.aBlock value,(6)控制结构 条件选择一般形式是:布尔子表达式 ifTrue:真块执行 ifFalse:假块执行“可以不出现”如:numberlistSize whileFalse:list at:index put:0。indexindex+1,(7)消息/方法消息模式|临时变量|语句组
7、 nawAt:initialLocationnewBox newBoxself new.newBox setLoc:initiaPLocation tilt:0size:100 scribe:pen new.newBox show.setLoc:newLoc tilt:newTilt size:newSize seribe:newScribe LocnewLoc.titlnewTilt.sizenewSize.scribe new Scribe,Smalltalk是编译解释执行的,Smalltalk源程序经编译器得到虚映象(Virtual image),虚映象由字节代码中间语言编写,由Smal
8、ltalk虚机解释执行。相应的文件系统管理三种文件:源文件、变更文件、映象文件。由于Smalltalk是交互式的,被编译的方法在执行期间出了问题要反应到源程序,则要对映象文件施行反编译(decompliation)Smalltalk的虚机是一个新软件,它有三个功能部分:存储管理器虚映象解释器基本例程 用汇编码写出的底层方法实现,4.1.4 Smalltalk文件系统与虚机,4.1.5 Smalltalk程序设计范型,程序设计在类的层次上进行,由类静态(于工作空间指明向类发出消息)或动态(方法运行时)生成实例对象。每个对象当接受某消息并执行其方法的消息表达式时都是在自向其它对象发消息。,4.1.
9、5.1 一个简单的Smalltalk程序,统计字母出现频率s f“定义了两个临时变量”sPrompter prompt:enter line default:.“s是Prompter的实例,将关键字表达式的结果束定于s”“意即输入一行字符串,若不输入,S为空串”fBag new.“f是Bag的实例”s do::cc isLetter ifTure:f add:c asLowerCase“s在Prompter中找方法do:的模式,若找不到,找prompter的”“父类直到Object.C是块变量,意从S中拿出某字符,isLetter”“是消息模式,判C是否字符,若为真执行内块”。“内块中f找ad
10、d:消息模式,从Bag直至上层父类,找到先执”“行右边子表达式”。c asLowerCase是单目表达式,同样要在Prompter中找asLowerCase匹配,也是不成向上找。它返回是“第k个”小写字母,add:把它发送到对象f的第k个位置上并与原数相加。f“返回f中的值”.这个程序一共四句。如果掀鼠标使菜单项doit工作并输入:“Smalltalk is a programming Language for developing soluions to both simple and complex problem.”则输出的f值是:7 1 1 2 4 1 5 1 5 1 7 4 4 7
11、3 3 6 3 2 1 a b c d e f g h i k l m n o p r s t u v,例 字频统计对比程序Pascal SmalltalkPROGRAM Frequency“无消息模式方法,宜写算法”CONST Size=80;VAR s:stringsize;|s c f k|k,i:Integer;“定义了四个临时变量”c:Char;f:ARRAY1.26 OF Integer;fArray new:26.BEGIN“f是Arrey实例长度26”Writeln(enter line);sPrompter ReadIn(s);prompt:enterline FOR i:=
12、1TO 26 DO default:.fi:=0;“S是Prompter的实例,装输入字串”FOR i:=1 To size DO 1 to:26 do:I|f at:I put:0.BEGIN 1 to:size do:I|c:=aslowerCase(si);c(s at:i)asLowerCase.if isLetter(c)THEN c isLetter ifTrue:BEGIN kc asciiValue k:=ord(c)-ord(a)+1;-a asciiValue+1.fk:=fk+1 f at:k put:(f at:k)+1 END END;.FOR i:=1 To 26
13、DO f Write(fi,)END.,4.1.5.2 类协议,4.1.5.3 一个完整的Smalltalk程序,家庭财务帐目 建立全部流水帐类,直接挂在Object上 class name FinancialHistory superclass Object instance variable names caseOnHand incomes expenditures category Financial Tools class method initialBalance:amount“建立流水帐本初始为amount(元)”super new setinitialBalance:amounT
14、 new“建立流水帐本初始为0(元)”super new setinitialBalance:0 instance method receive:amount from:source incomes at:source put:lself total ReceivedFrom:source)+amount.“从来源source接收到的钱数,因而手头现金增加”.cashOnHandcashOnHand+amount.incomes changed spend:amount for:reason“为事由reason支付的钱数,因而手头现金减少。”expenditures at:reason put
15、:(self totalSpentFor:reason)+amount.,cashOnHand cashOnHand-amount.expenditures changed CashOnHand“回答当前手头现金”cashOnHand expenditures“回答支出细目”expenditures incomes“回答收入细目”incomes totalReceiveFrom:source“回答自source收钱总数”(incomes includesKey:source)ifTrue:incomes at:source ifFalse:0 totalSpentFor:reason“回答在r
16、eason项上总支出”(expenditures includesKey:reason)ifTrue:expenditures at:reason ifFalse:0 private SetlnitialBalance:amount“实例变量初始化”cashOnHandamount.incomesDictionary new.expendituresDictionary new,Smalltalk at:#HouseholdFinances put:nil.HouseholdFinancesFinancealHistory initialBalance:1560 HouseholdFinanc
17、es spend:700 for:rent.NouseholdFinances spend:78.53 for:food.HouseholdFinances receive:820 from:pay.HouseholdFinances receive:22.15 from:interest.HouseholdFinances spend:135.65 for:utilities.HouseholdFinances spend:146.14 for:food.,4.1.6 Smalltalk程序设计系统,在Smalltalk中,系统支持程序也是作为类挂在Object之下,包括算术运算、数据和控制
18、结构的实现、输入/出、随机数生成器等。有一些类是辅助程序设计过程的,语法分析器、编译器、解释器、反编译器这些对象的方法都有源代码,目标码两种形式。还有一些对象表示类和方法的结构,以便程序员追踪系统。还有将方法和向其发消息的对象联结起来的对象.这些对象统称环境(contexts)类似其他语言实现中的堆栈帧和活动记录。,4.2 Smalltalk的对象、类、方法的实现 类的存储,实例对象的存储 实例对象只存放数据,其存储格式如下图:,活动记录 环境部分 指令部分 发送者部分,4.3 面向对象,为什么需要面向对象?OO语言的发展面向对象的基本概念封装和继承初始化和终结处理动态方法约束,重用的问题,实
19、践中人们认识到重用已有开发结果的重要性,提出了软件重用的概念最早的重用单元是子程序,如Fortran的子程序库子程序是纯粹的过程抽象,基于子程序的重用有很大局限性模块是更合适的重用单元,因为模块可以包装任何功能,更灵活重用中有一种常见情况:软件开发中遇到的新问题常与解决过的问题(可以重用的库提供的功能)类似,但又不完全相同已有模块的功能与需要有差异,无法以其“现有”形式直接使用如果模块功能的改变只能通过修改源代码的方式进行,程序员就只能拷贝这个模块的源代码,深入研究后再设法修改,以满足新需求但问题是有没有可以使用的源代码?常常没有:模块可能是购入的,提供商不提供源代码模块可能是过去的遗产,源代
20、码已经丢失或部分缺失,重用和软件开发,即使有源代码,基于修改代码的方式重用,也有很多问题:修改代码的代价可能很大(需要理解开发者的想法、设计和大量细节)修改代码很容易引进错误经过修改的代码,其可读性、易理解性和易维护性都会恶化,多次修改导致这些性质不断恶化,可能给整个系统的质量带来严重危害修改后的模块,继续重用的可能性更小总之,基于修改代码的重用,重用的价值大大降低了在软件开发过程,重用也是非常有价值的在同一软件中重复使用某些部分,可使重要设计决策得到集中处理提高重用比率可能减少重复开发工作量对重要基础功能的深度优化可能非常耗工耗时,重用已有的经过精心调整的代码,可能大大提高系统的性能,模块和
21、程序组织,常规的程序单元缺乏弹性,定义好的子程序/模块都是固定功能的实体,难以提供“定制”的方式部分地改变功能以满足实际需要的变化通过模块定义的抽象数据类型是相互独立的,不同模块之间无任何关系而实际情况中,常常需要定义和使用一些相互有关的类型,可能需要把它们送给同一个函数/过程去处理,以同样方式存储变体和联合机制就是为了迎合这方面的需要,但它们没有类型安全性,且未能提供解决类似问题的统一框架,难用于应付更复杂的情况支持相关类型,可能给程序的结构组织带来新的可能性如何在抽象数据类型的框架中提供这一类功能,也是需要解决的问题面向对象的概念在这些方面都能发挥很大的作用面向对象(Object-Orie
22、nted)的方法和程序技术,为基于模块(一个类也可以看作一个模块)的重用问题提供了一条解决途径。,面向对象和重用,面向对象技术的最重要能力,在于使程序员比较容易以一种外部附加的方式,在已有数据抽象的基础上定义新的数据抽象OO也支持定义有弹性的操作框架,使新的数据抽象可以使用这些框架,并把针对该类抽象的实例的具体操作插入框架中(重用和调整)新定义的抽象可以继承原有抽象的行为,也可以根据需要调整改变已有功能的行为,或者添加新抽象所需要的新行为这样大大提高了代码重用的可能性(目标是实现真正不加修改的重用。当然,实际的重用可能性还与具体数据抽象的设计有关)面向对象还有另外的许多重要价值(有些可能同样重
23、要或更重要),并由此发展出“面向对象的系统分析”,“面向对象的设计”等面向对象思想对于软件领域的影响是全面的,是结构化思想(结构化程序设计,结构化分析,结构化设计等)之后软件开发领域中的又一次革命注意:面向对象并没有取代结构化,应该看作是在另一层次上的抽象,OO发展史,OO技术和思想中的一个基本方面是数据和操作的封装这方面的基本想法:一组数据与关联之上相关的操作形成一个对象。其内部数据构成对象的状态,操作确定对象与外界交互的方式OO并不是从模块化程序设计发展出来的,它有自己的发展历程OO的思想与模块化的思想是并行发展,一直相互影响、相互借鉴Simula67是OO概念的鼻祖,其设计目标是扩充Al
24、gol60,以更好地支持计算机在模拟方面的应用。1960年代在挪威计算中心设计和实现,主持其工作的Ole-JohanDahl和KristenNygaard获得2001年图灵奖OO的三个基本要素:封装、继承和动态方法约束都源于Simula类的概念源自Simula,其设计中提出用类定义把一组操作与一组数据包装起来。Simula的这些重要想法是模块概念和OO的起源Simula只提供了基本封装,并没有对封装的保护,也没有信息隐藏,OO发展史,软件实践也需要OO的思想,并逐渐开发了相关的支撑技术,包括:封装的思想在面向模块的语言里发展,提出了许多重要概念和想法,如作用域规则,开的或者闭的作用域界面与实现
25、透明类型与隐晦类型,访问控制,等等数据驱动的程序设计技术:将计算功能(子程序)约束于程序里处理的数据(结构),使我们在程序里可以从数据对象出发去启动相应的计算过程在一些非常规的语言(如函数式语言)里,可以通过引用的概念提供函数/过程与数据之间的约束常规语言(如C)引进了指向函数的指针,在实现数据驱动程序设计的过程中起到了重要作用,也成为面向对象语言实现的技术基础,OO发展史,继承和动态约束等被Smalltalk发展,形成目前OO的基本概念框架程序里以类的方式定义各种数据抽象类可以通过继承的方式扩充新功能,这样定义的新类(子类,派生类)自动继承已有类(基类,超类,父类)的功能对象是类的实例,是程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 04 面向 对象 程序设计语言
链接地址:https://www.31ppt.com/p-6614728.html