我们可理解“纯粹”的面向对象程序设计方法是什么样的:
(1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。
(2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。
(3) 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
(4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。
(5) 同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。
一些语言设计者认为面向对象的程序设计本身并不足以方便解决所有形式的程序问题,提倡将不同的方法组合成“多形程序设计语言”
面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。
对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,
任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,
面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;
面向对象编程语言为:程序=对象+消息。
面向对象要完全支持封装、继承和多态,如C++和Java;而基于对象只要支持封装就可以了,如VB6.0。
in object theory, OO is seperated to object-based and class-based world.Java, C++, C# are class-based. You have class to describe your object.object-based language does not have class. What you have is simply objects.
And you may use prototype to clone objects.(modern object-based languages
utilize prototype and traits,
which make them more and more like class-based language)I feel python is kind of an object-based language.
面向对象,将软件程序的元素构造成对象,指定对象类型,表示对象属性,和描述对象方法,
定义对象后即可用于创建这种
类型的对象的具体实例并构造其他更复杂的对象类型。基于对象的编程语言,并不支持所有面向对象的功能,往往基于对象只提供一部分面向对象的功能,
有时加入自己的新功能。例:java是面向对象的程序设计语言,JAVASCRIPT是基于对象的程序设计语言(脚本语言)
,javascript并不支持所有
java面向对象的功能,致使支持其中一部分!
按照传统的思想,面向对象和基于对象之间的界限可以说是既清楚又模糊。说它清楚,
是因为面向对象语言必须从语法上直
接支持继承和动态绑定,也就是虚函数机制。说它模糊,是因为基于对象的语言可以
在没有语法直接支持的情况下,达成与
面向对象语言相同的效果。举个例子,在很多用C语言写成的操作系统里,“File”这个概念,
既可以代表磁盘文件,也可
以代表串行口,还可以代表各种各样的设备,这不是多态性是什么?有一个概念大家必须改变,就大部分当前项目而言,C语言已经是一种基于对象甚至面向对象的语言,
而不是单纯的“面向过程”
语言,例如在Win32 API编程中,实际上我们就是在按照面向对象的模式撰写程序。
另外,最经典的基于对象语言是Ada83。按照我现在的体会,面向对象这个概念,更多的是说一种环境和一种设计思维方式。要谈这个问题,实在需要不少篇幅,
这里就不多说了。
Object-oriented支持Polymorphism,而Object-based不支持Polymorphism.主要的区别就在于此。
支持多态的代价是额外的间接性--
不论是在“内存的获得”或是在“类型的决断”上。C++通过class的pointers和references来支持多态,这种程序设计风格就叫面向对象。C++也支持具体的ADT程序风格,被称为基于对象,它只支持封装,不支持类型的扩充。一个Object-based设计可能比一个对等的Object-oriented设计速度更快而且空间更紧凑。
速度快是因为所有的函数引发操作都在编译时期解析完成,不需要设置virtual机制;
空间紧凑则是因为每一个class object不需要负担传统上为了支持virtual机制而需要的额外负担。
不过,Object-based设计比较没有弹性。这是引用《深度探索C++对象模型》上第一章最后几段的话。上面有更详细的讨论!