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