基于对象和面向对象

以前看书时,看到过基于对象和面对对象,不过没有深究。今天又看到了就好好地在网上搜了搜。

好多地方都有如下一段:

“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)缺一不可,通常“基于对象”使用对象,但是无法利用现有的对象模板产 生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点,而“多态”是表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使 用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。

这段文字出自我的面向对象程序观


面对对象(Object-Oriented)
基于对象(Object-Based)
基于对象编程通常关于没有继承的对象也就因此没有了多态[Cardelli 85]。

说一种语言是面向对象的当且仅当它满足如下要求:
——支持对象。对象是拥有命名操作接口和隐藏局部状态的数据抽象。
——对象具有关联类型
——类型能从父类继承属性(attributes)

面向对象(Object-Oriented)=数据抽象(data abstractions)+对象类型(object types)+类型继承(type inheritance)
这些定义也可以在[Booch91,Ch2 and Wegner 87]找到。

[Coad 91]提供了另一个模型:
面向对象(Object-Oriented) = 类和对象(data abstractions) + 继承(Inheritance) + 通过消息的通信(Communication with messages)

Stroustrup 的[Stroustrup 91,'86 p.37]的第一版定义基于对象如下:在每个对象中存储类型识别(type identification) 带给我们的是一种编程风格,经常被叫做“基于对象”,这和C+W中的有很大不同。

摘自《深度探索C++对象模型》

面向对象支持多态,而基于对象不支持多态,主要区别就在于此。支持多态的代价是额外的间接性——不论是在”内存的获取“或者是在”类型的决断“上。

C++通过class的pointers和references来支持多态,这种程序设计风格就叫做面向对象。

C++也支持具体的ADT程序风格,被称为基于对象,它只支持封装,不支持类型的扩充。

一个基于对象设计可能比一个对等的面向对象设计速度更快而且空间更紧凑。速度快是因为所有的函数引发操作都在编译期解析完成,不需要设置virtual机制,空间紧凑则是因为每一个类对象不需要在负担传统上为了支持virtual机制而需要的额外负担。不过,基于对象设计比较没有弹性。

 

 例如:Visual Basic(4.0-6.0)是基于对象开发工具,不是面对对象开发工具。因为它不支持继承。它只支持封装。

Visual Basic 7.0 支持继承,重载,重写和多态,所以我们称VB7.0是OOPL——面向对象编程语言。

 C++是一个特例。因为它既可以编写面向过程的程序,也可以编写基于对象的程序,还可以编写面向对象的程序。

JavaScript语言是基于对象的,而不是面向对象的。之所以说它是一门基于对象的语言,主要是因为它没有提供像抽象、继承、重载等有关面向对象语言的许多功能。而是把其它语言所创建的复杂对象统一起来,从而形成一个非常强大的对象系统。

虽然JavaScript语言是一门基于对象的语言,但它还是具有一些面向对象的基本特征。它可以根据需要创建自己的对象,从而进一步扩大JavaScript的应用范围,增强编写功能强大的Web文档。

参考: What Is The Difference Between Object-Based And Object-Oriented

 我的面向对象程序观

 Object-Based与Object-Oriented的区别是什么?

原文地址:https://www.cnblogs.com/qishichang/p/1613306.html