词条 | 面向对象语言 |
释义 | 中科永联高级技术培训中心(www.itisedu.com) 面向对象语言(Object-Oriented Language)是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。语言中提供了类、继承等成分。 面向对象语言借鉴了20世纪50年代的人工智能语言LISP,引入了动态绑定和交互式开发环境的思耄皇加?0年代的离散事件模拟语言SIMULA67,引入了类的要领和继承,成形于70年代的Smalltalk。面向对象语言的发展有两个方向:一种是纯面向对象语言,如Smalltalk、EIFFEL等;另一种是混合型面向对象语言,即在过程式语言及其它语言中加入类、继承等成分,如C++、Objective-C等。 面向对象语言刻画客观系统较为自然,便于软件扩充与复用。有4个主要特点: (1)识认性,系统中的基本构件可识认为一组可识别的离散对象; (2)类别性,系统具有相同数据结构与行为的所有对象可组成一类; (3)多态性,对象具有惟一的静态类型和多个可能的动态类型; (4)继承性,在基本层次关系的不同类中共享数据和操作。 其中,前三者为基础,继承是特色。四者(有时再加上动态绑定)结合使用,体现出面向对象语言的表达能力。 一般认为,较典型的面向对象语言有: SIMULA67,支持单继承和一定含义的多态和部分动态绑定; Smalltalk支持单继承、多态和动态绑定; EIFFEL,支持多继承、多态和动态绑定; C++,支持多继承、多态和部分动态绑定。 四种语言涉及概念的含义虽基本相同,但所用术语有别。 基于类的面向对象语言 基于类的面向对象语言是面向对象世界里的主流。它包括: Simula, 第一个面向对象语言 Smalltalk, 第一个支持动态类型的语言 C++, 它的大部分基于类的特性继承自Simula.等等等等。 与基于类的语言相对应的是基于对象的面向对象语言。这里“基于对象”的概念和把Visual Basic叫做基于对象的概念是不同的。这里的“基于对象”是指一个只以对象为中心,没有类的概念的语言,类似Python之类的语言。 现在,我们来介绍一下基于类的面向对象语言的一些共同特征。 1.类和对象 让我们先看一个类的定义: class cell is var contents: Integer :=0; method get(): Integer is return self.contents; end; method set(n:Integer) is self.contents := n; end; end; 一个类是用来描述所有属于这个类的对象的共同结构的。这个cell类表示的对象拥有一个叫做contents的整数属性(attribute),这个属性被初始化成0。它还描述了两个操作contents的方法。Get和set. 这两个方法的内容都是很直观的。Self变量表示这个对象自己。 对象的动态语义可以这样理解: 一个对象在内部被表示为一个指向一组属性的指针。任何对这个对象的操作都会经过这个指针操作对象的属性和方法。而当对象被赋值或被当作参数传递的时候,所传递的只是指针,这样一来,同一组属性就可以被共享。 (注, 有些语言如C++, 明确区分指向属性组的指针和属性组本身,而一些其它的语言则隐藏了这种区别) 对象可以用new从一个类中实例化。准确地说,new C分配了一组属性,并返回指向这组属性的指针。这组属性被赋予了初始值,并包括了类C所定义的方法的代码。 下面我们来考虑类型。对一个new C所生成的对象,我们把它的类型记为InstanceTypeOf(c). 一个例子是: var myCell: InstanceTypeOf(cell) := new cell; 这里,通过引入InstanceTypeOf(cell), 我们开始把class和type区分开来了。我们也可以把cell本身当作是类型,但接下来,你就会发现,那样做会导致混淆的。 2.方法解析(Method Lookup) 给出一个方法的调用o.m(……), 一个由各个语言自己实现的叫做方法解析的过程负责找到正确的方法的代码。(译者按:是不是想起了vtable了?)。 直观地看,方法的代码可以被嵌入各个单个对象中,而且,对于许多面向对象语言,对属性和方法的相似的语法,也确实给人这种印象。 不过,考虑到节省空间,很少有语言这样实现。比较普遍的方法是,语言会生成许多method suite, 而这些method suite可以被同一个类的对象们所共享。方法解析过程会延着对象内指向method suite的指针找到方法。 在考虑到继承的情况,方法解析会更加复杂化。Method suite也许会被组成一个树,而对一个方法的解析也许要查找一系列method suite. 而如果有多继承的话,method suite甚至可能组成有向图,或者是环。 方法解析可能发生在编译时,也可能发生在运行时。 在一些语言中,方法到底是嵌入对象中的,还是存在于method suite中这种细节,对程序员是无关紧要的。因为,所有能区分这两种模式的语言特性一般在基于类的面向对象语言中都不被支持。 比如说,方法并不能象属性一样从对象中取出来当作函数使用。方法也不能象属性一样在对象中被更新。(也就是说,你更新了一个对象的方法,而同一个类的其它对象的该方法保持不变。) 3. 子类和继承(Subclassing and Inheritance) 子类和一般的类一样,也是用来描述对象的结构的。但是,它是通过继承其它类的结构来渐进式地实现这个目的。 父类的属性会被隐式地复制到子类,子类也可以添加新的属性。在一些语言中,子类甚至可以override父类的属性(通过更改属性的类型来实现) 父类中的方法可以被复制到子类,也可以被子类override. 一个子类的代码的示例如下: subclass reCell of cell is var backup: Integer := 0; override set(n: Integer) is self.backup := self.contents; super.set(n); end; method restore() is self.contents := self.backup; end; end; 对有subclass的方法解析,根据语言是静态类型还是动态类型而有所不同。 在静态类型的语言(如C++, Java)里,父类,子类的method suite的拓扑结构在编译时就已经确定,所以可以把父类的method suite里的方法合并到子类的method suite中去,方法解析时就不用再搜索这个method suite的树或图了。(译者按:C++的vtable就是这种方法) 而对于动态类型的语言,(也就是说,父子类的关系是在运行时决定的),method suite就无法合并了。所以,方法解析时,就要沿着这个动态生成的树或有向图搜索直到找到合适的方法。而如果语言支持多继承,这个搜索就更复杂了。 一个生动的比喻:人类原始语言--面向对象语言 不知道这样的比喻是不是恰当:人生就象是一段程序, 只不过这段程序是由上帝用特殊的代码编写而成,里面的算法极其复杂.这世界上谁也不会看懂,谁能看懂谁就是上帝.除非就象拖动播放器一样去拖动时间,你才会猛然发现后面的事情.但是时间是不能拖动的.至少现在是这样.于是对将来的无知就使我们有了恐惧 . 我想也许上帝编写他的庞大的程序应该综合了很多语言,而在编写“human”这个类的时候我想也许他主要用的应该是面向对象这种语言吧.他赋予了我们每个人类对象一些属性 ,一些行为,并且使之归类.物以类聚,人以群分,体现的正身属于什么类.能做什么?不能做什么?而我就属于那种再平凡不过的替其他代码服务的方法, 别人只需要调用就可 . 有的代码有局限性,写出来只能在一定的环境才能运行.我们周围的大自然就是 ,比如高山,大树,房屋,大海,甚至地球等星球。而有的代码写出来以后,可以在任何地方运行.比如面向对象语(JAVA).而我偏偏就属于前一种代码,顶多生活在自己的世界就已经是非常幸福了.其实到现在我都没有达到.而大多数人就属于后者,走到哪儿都能生存, 都能适应.所以说我们人类的适应力其实是最强的. 还有一种代码就是乱码 ,让人看不懂. 谁也不理解他, 他也不理解这个世界. 由于现代社会的冷漠和沟通的减少,以及人们表达方式所产生的误会,这种代码也有很多 .他们孤单寂寞 ,感情得不到宣泄 ,压抑得不到释放 ,似被忽略, 不值得提. 有的代码写出来以后什么用处也没有, 他的存在只是浪费时间和空间 ,浪费资源而已 .什么都不做 ,或者说尽做一些毫无用处的事 .其实也不能这么说 .正如你在大街上看到乞丐一样 ,也许你会害怕那种情形 ,所以你使自己努力, 奋进 ,最后成为一位杰出的人才. 这都归于乞丐在你心中留下的阴影 ,只不过我们看不见这种实际存在的作用.而有的代码功能十分的庞大,服务很多,可以做许多有意义 ,有用的事. 我们当中的掌管技术或艺术的人就属于这一类. 他们是推动社会的核心力量 ,他们的存在就是让世界前进 ,发展 ,让这个世界充满勃勃生机.然而还有一种代码, 自己没有多少的服务和动作, 而是靠调用别的代码来达到目的. 不要说这种代码可恶, 这种代码其实最有用. 通过他的调用 别的代码才能发挥自己的作用 ,才能体现出价值来. 我们当中也有很多这种类型的人 .比如公司的经理,总裁,地区的市长,国家的主席等,他们通常是上流社会的主导,控制着世界发展的方向. 没有他们的控制和管理, 恐怕社会将体现不出应有的价值. 我们每个人都无法看透别人 ,正如类的封装一样. 如果要想了解一点的话 ,可以通过消息与其他事物互动 .所以这样也只是对事物了解了一点点 ,因此不要说你看透了谁 ,你了解透了谁 ,至少你不能了解他的真真的本身属性.其实很多人所说的掌握了真理只不过是一些事物所表现出来的类似真理的表象而已. 所以我们为人处事应该谦虚, 因为我们知道的只有一丁点 .实际上我们经常只是实列连接 ,就如同父辈和我们这代之间的鸿沟一样 .彼此都不通过消息去了解 .但有一点就是 我们至少必须了解自己 .给自己定位. 这就是所谓的自知. 同样 ,人必须要发展 ,要进步, 如同类的继承一样, 子类继承了父类. 而且他本身还增加了许多功能. 这样才能提高内涵, 提高自身的价值.而上帝实际上就是用“遗传”和“变异”来体现这一设计的. 而且类还具有多态性 ,可以继承他上面的许多的父类. 所以我们要多多向那些比我们优秀的人学习, 继承他们的优点, 学习他们的智慧. 如果你觉的继承过来的东西满足不了你或不适合你, 怎么办呢? 不要紧, 上帝编写程序的时候早就考虑到了. 他允许每个“person”这个实列重写父类中的方法, 以适应自己本身. 也就是方法覆盖. 东方曾经就是向西方学习 ,继承了他们的先进之处, 再结合自己的特点, 走自己的特色道路, 这就是一个很好的列子. 另外就是接口要多, 这样才活跃. 很多东西都可以通过接口来了解你的很多特点. 这便是开放 .让别人来了解自己 ,也让自己在别人面前表现出自己的价值, 存在的意义. 而有的代码则相反 ,没有什么接口,甚至根本就没有接口 .把自己孤立起来, 让人不能理解 .任何一方面都无法与他沟通. 这就会导致自闭 ,而自闭又会导致落后, 挨打 .中国曾经就是由于闭关锁国,闭门造车而导致发展缓慢,十分落后,而现在就不一样了,加入了世贸,融入了世界,成为了强国,甚至成为了带动世界经济的火车头,这就是一个很大的转变. 程序有重复和选择结构, 我相信我们人类这道程序也应该是. 比如可以发明时间机器, 直接跳到后面去执行语句, 而我们就走向了未来. 或是再返回去重复执行以前的语句, 就如同我们回到从前, 再去经历一遍. 当然 ,这是要有条件的, 要根据条件选择. 而我们要具备的条件就是技术, 这样才能发明时间机器. 但这就要看上帝要在什么时候实现这一小目标"时间机器的诞生" 程序设计总是强调弱耦合,强内聚.而上帝在面向人类对象的设计中也是这样的. 他是希望我们每个人不要太依赖别人,而是要靠自己的实力去实现愿望 . 中国就是这样, 走自己的特色道路, 坚持自力更生 ,艰苦奋斗,最终实现了社会主义社会 . 还有就是包, 里面的内容十分丰富. 每个类或实列都可以直接或间接享用或吸收里面的东西. 比如LANG包. 而事实上中国共产党就属于这个包, 起到SUPER的作用. 我们每个人都是在党的怀抱下成长的, 我们每个人都直接或间接的继承他的优良传统和作风,才使我们中华民族的每个子女这么优秀 .因此我们每个人都要爱戴党,拥护党,加入党。 上帝好象有意偏袒生命这种不同寻常的东西, 在面向对象的时候, 他还赋予每段代码不同寻常的功能. 那就是代码本身在适当的时候可以改变自己, 调整自己 ,以适应需要. 这是个了不起的设计. 敢这样说: 就因为这个设计, 世界才能发展到现在. 这个类的类名叫"life" 是高贵的 ,功能最强的 ,尤其是在"person"这一方面体现的更强烈. 正如我们在失败的时候可以及时的调整自己的心态, 重新开始. 或者在了解自己很落后的时候 ,可以让自己去学习, 去工作. 或者说在受到伤害的时候努力让自己坚持. 也就是说, 在做任何事情的时候可以根据需要随时改变自己的动作或心态去迎合目标. 这有点象函数 ,能根据不同的参数计算出不同的结果. 而我们的性格和行为就相当于自变量 ,改变自变量, 将改变结果 .或者说就正如方法重载 ,虽然类名是一样的, 但可以根据参数个数或类型而自己就判定应该调用那一个方法 ,应该做那些动作. 所不同的是, 我们不但可以赋予自己不同的参数 ,我们还能改变自己的算法方式 .而函数就不行, 算法方式已经定下了 ,只能由此算法改变结果而已.因此说这种代码是高度智慧的, 也就是说 ,上帝在编写他的时候赋予了他特殊的方法:允许对象调用自己本身去创造方法. 也就是说他把我们设计成了主动对象, 而把其他事物设计成了被动对象 .上帝是希望通过我们人类的主动性去发现事物 ,发现真理, 探索世界. 缺了他 ,世界将是一片荒凉, 如同机械一般 ,没有激情 ,没有生机, 就象风穿梭在黑夜. 所有的程序都是“固定”的, 也就是说编写好了以后他总是按照程序“本身”去执行 ,不会有任何意外. 对与普通程序, 死机可能是一种意外. 其实不是 ,死机无非就是程序中断,这也是符合程序本身的. 因为你的程序只能做到这样:死机的时候中断. 上帝在设计我们人类的时候也是这样的. 如果我们有意外, 比如地球毁灭, 太阳寿尽, 那也没办法, 因为上帝在编写程序的时候没有编写处理异常的代码. 也许他编写了, 只不过这段代码到后期才能执行, 但谁知道呢. 普通代码通常是这段代码执行完以后再去执行那段代码.也就是所谓的顺序执行. 同样 ,上帝编写的程序也不列外 .有因必有果, 所有事情的发生一点也不偶然,正如东京的蝴蝶振动一下翅膀,纽约就会倾盆大雨,而其间的一系列连环反应谁也不清楚, 但这一切其实都是已“注定”的.任何人都无法改变自己的“FORTUNE” 你可能会说, 我就可以改变自己的命运, 我要靠自己的努力去改变自己的人生. 恭喜你 !你就是那段具有高度智慧的代码, 能根据需要随时改变自己的状态和行为. 但是, 这个改变本身实际上仍然是上帝赋予你的. 是他老人家安排我们能做什么 ,不能做什么。 |
随便看 |
百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。