基于对象和面向对象的区别
基本上每个程序员都听过面向对象(Object-oriented)和基于对象(Object-based)这两个概念。其实这两个概念并没有很明显的界线,不过现在业界比较统一的认为只有完全具有封装、继承、多态三大特点的才能够叫做面向对象,否则即使设计中蕴含了一些对象的概念,也顶多称为基于对象。
基于对象是过程化语言自然演进而来,随着ADT【1】思想的成熟而成熟,七十年代到八十年代初曾经非常流行,但是很快被风头更盛的面向对象给遮盖了,最典型的代表是Ada83。一贯被人认为是过程化语言代表的C语言,在实际应用中基本上使用的是基于对象的思想。虽然默默无闻,但是基于对象思想下开发的软件,实际上构成了我们现在的软件工业基础。
面向对象发源于60年代的挪威,第一个面向对象语言是Simula,思想成熟于80-90年代。其标志就是继承和多态。面向对象思想的主要历史贡献是催生了面向组件思想,简化了日常编程。从严肃的软件工程意义上来讲,面向对象究竟是不是“一个历史性的进步”,还有待历史检验,但是这种思想方法现在已经成为主流,所以无论是不是进步,已经成为现实。
通常基于对象是使用对象,意味着它们有像C++的结构加函数这样的对象,然而这只是到达面向对象语言的一部分,停留在把函数捆绑在结构内部的语言是基于对象的。但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说基于对象一般没有继承的特点。没有了继承的概念也就无从谈论多态。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。例如:C++是面向对象的,而VB只是基于对象的。当然,搜索现在国内大量的书籍与资料(包括大量教材)的作者都无法分清两者之间的区别,把VB称为面向对象,误人子弟。
注:
【1】ADT(Abstract Data Type)是指一个数学模型以及定义在该模型上的一组操作。ADT包括数据数据元素,数据关系以及相关的操作。即ADT
{
数据对象:(数据元素集合)
数据关系:(数据关系二元组结合)
基本操作:(操作函数的罗列)
}
抽象数据类型(ADT)的一个实现包括储存数据元素的存储结构以及实现基本操作的算法。在这个数据抽象思想中,数据类型的定义和它的实现是分开的,这在软件设计中是一个重要的概念。这使得只研究和使用它的结构而不用考虑它的实现细节成为可能。在面向对象编程语言中,像C++、Java都能较好的支持ADT,如类的机制。而在C语言中缺少了对相关方法的支持。抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。抽象数据类型是与表示无关的数据类型,是一个数据模型及定义在该模型上的一组运算。对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。