面向对象和基于对象的语言之间的核心区别
Posted
技术标签:
【中文标题】面向对象和基于对象的语言之间的核心区别【英文标题】:Core difference between object oriented and object based language 【发布时间】:2013-03-04 00:37:08 【问题描述】:我想知道两者的核心区别是什么
面向对象和基于对象的语言
我看过很多帖子,他们都在说两件事
面向对象的语言支持 OOP 的所有特性,而基于对象的语言不支持 OOP 的所有特性,如多态性和继承。
他们给出了 javascript 作为基于对象和 java 作为面向对象的示例
赞这个***的帖子
Difference between object oriented and object based language
但我想知道这两个概念之间的核心区别是什么,无论任何语言。
找到答案
终于搞定了
感谢Matías Fidemraizer
答案不依赖于任何语言,不依赖于任何功能,我正在寻找的核心差异是
本身包含对象的语言称为基于对象的语言,遵循面向对象概念的语言称为面向对象语言
【问题讨论】:
投反对票的能不能给我答案 你的结论不对:Java、C# 和几乎所有语言都有内置对象。事实上,它们有一个最顶层的内置对象:object
类,它是所有对象的隐式基类。我的意思是,Window
对象是一个内置对象,就“任何浏览器实现都有一个 Window 对象”而言,但这个事实并没有定义它是对象编程还是面向对象编程。
@MatíasFidemraizer 刚才你说我是对的
【参考方案1】:
粗略...
面向对象:支持封装、继承、多态 基于对象:支持封装Wikipedia - Object-Based Language
【讨论】:
【参考方案2】:面向对象的语言
Object-orientd language supports all the features of OOPs
Object-orientd language does not has in-built object
Object-orientd languages are C++, C#, Java etc
基于对象的语言
Object-based language doesn't support all the features of OOPs like Polymorphism and Inheritance
Object-based language has in-built object like JavaScript has window object.
Object-based languages are JavaScript, VB etc.
希望,这将澄清您的疑问。
【讨论】:
【参考方案3】:JavaScript 是一种面向原型的语言。
它可以从构造函数构建实际对象,并且几乎具有任何对象可能具有的任何功能:
构造函数。 方法(即 JavaScript 中的函数)。 属性(从 ECMA 脚本 5 开始,“getters/setters”)。 实例。在 JavaScript 中,任何对象都有一个原型,包括函数。原型本身是将对象成员添加到整个对象的任何新创建实例的基本方法。
var constructor = function() ;
constructor.prototype.text = "hello world";
alert(new constructor().text); // This alerts hello world
为什么 JavaScript 不是面向对象的编程(脚本)语言?因为它没有符合面向对象编程定义要求的特性:
多态性:否。您可以更改原型成员的行为,但这只是重用标识符。您无法访问 伪派生对象中成员的先前实现。 继承:完全没有。也许原型链可以与继承相媲美,但 JavaScript(ECMA-Script 5.x 或更早版本)不像其他基于 OOP 的语言(即 Java、C#、Ruby、Python、VisualBasic.NET、... )。 封装。是的,当然可以,但无法创建实际的私有或内部对象成员。也许我忘了提一些其他的细节,但老实说,我相信这是一个很好的总结。
更新与总结
核心区别在于面向对象的编程语言具有面向对象范式必须具备的特性才能被视为面向对象的编程语言。 因此,JavaScript 目前还不是一种真正的面向对象编程语言,因为它缺乏真正的多态性和继承性。
更新:ES2015 及更高版本是否改变了这种情况?
从美学上讲是的,ES2015 及更高版本有一个重大改进,让我们考虑一个不完全但更接近面向对象的编程:调用 超类的语法糖。
例如:
class A
doStuff()
console.log("hello world");
class B extends A
doStuff()
super.doStuff();
console.log("...and goodbye!");
这是多态。更专业的类可以覆盖其基类,以完全改变函数行为或执行基类已经在做的事情,向函数添加新代码。
顺便说一句,ES2015 及更高版本仍然缺乏真正的封装:private
或 public
这样的访问修饰符在哪里? 无处。
而且,归根结底,ES2015 及更高版本实现了基于类的 OOP,但它仍然是 ECMAScript 5.x 之上的语法糖层... 上面的代码仍然适用于底层原型,并且可以正常工作就像在 ECMAScript 5.x 中编写代码一样:
function A()
A.prototype.doStuff = function()
console.log("hello world");
;
function B()
B.prototype = Object.create(A.prototype);
B.prototype.doStuff = function()
A.prototype.doStuff.call(this);
console.log("...and goodbye!");
;
希望我需要再次更新这个答案,因为 ES2020 已经提出了访问修饰符,我们将能够考虑将 JavaScript 视为另一种完全支持面向对象编程的语言!
【讨论】:
但是我不需要用 javascript 做任何事情我只想知道面向对象和基于对象的语言之间的核心区别是什么 @user2164685 答案让你与众不同。打开你的思路 :) JavaScript 是面向对象的,因为它有对象,但它不是面向对象的编程,因为它没有面向对象的编程语言需要被视为面向对象的编程! 意思是说本身包含对象的语言称为基于对象的语言,遵循面向对象概念的语言称为面向对象的语言... @user2164685 希望 :) 太好了! JavaScript 具有继承性。如果您想看到它的实际效果,只需说Object.prototype.sayHi = function() console.log("Hi!");
,现在系统中的几乎每个对象都可以sayHi()
。原型继承就是继承——只是没有面向类的官僚机构。【参考方案4】:
基于对象的语言基本上包括任何能够提供轻松创建和使用对象的内置功能的语言。有一个主要标准:
封装。对象附加了一个 API,通常以这样一种方式,您可以通过告诉它做什么而不是运行某些函数来处理对象就可以了。
大多数基于对象的语言根据“类”定义对象,这些基本上是对象的蓝图。该类列出了对象的内部结构并定义了 API。
不过,这不是唯一的方法。例如,在 JavaScript 中,对象并没有真正的“类”。任何对象都可以拥有它想要的任何属性。由于函数是 JavaScript 中的一等值,因此可以将它们设置为对象的属性,并用作对象的 API。
就基于对象但非面向对象的语言而言,一个很好的例子是 Visual Basic(不是 .net 的东西;我说的是 VB6 和 VBA)。类存在,但不能相互继承。
面向对象的语言是基于对象的语言,它使事情更进一步。它们内置了对 OOP 的另外两个支柱的支持:
继承。 对象必须具有成为(并被视为)其他对象的特化的能力。这意味着,例如,能够将“狗”定义为“可以吠叫和抓树枝的动物”。
在现代语言中,它通常采用一个对象的 class 继承自另一个对象的 class 的形式。不过,这不是必需的;与某些人试图告诉你的相反,OOP 的定义根本不需要类。
多态性。 代码必须能够使用一个对象,而无需知道或关心它究竟是什么类型。
大多数语言(尤其是静态类型语言)根据类和继承来定义多态性。如果您有一个从 A 继承的 B 类,则需要引用 A 的代码通常可以采用 B,但不能采用与 A 无关的某些 C 类。Java 也有 interface
关键字,它允许你定义了一个类必须实现的一组行为。任何其类显式为 implements X
并因此实现接口 X 上定义的函数的对象,都可以作为类型 X 的实例。
其他语言(如 JavaScript)允许您传递任何您喜欢的对象。只要对象呈现正确的界面,它到底是什么类型的对象并不重要。这被称为“鸭子类型”,它几乎是最纯粹的多态形式。
【讨论】:
【参考方案5】:面向对象的编程语言遵循属于 OOP 的所有概念。
基于对象的编程语言具有已构建的对象,因此无需创建对象,并且除了继承之外,它还遵循 OOP 概念,
【讨论】:
【参考方案6】:OOP 和 OBP 是两种遵循不同原则的编程语言。
OOP:遵循多态、继承和封装(PIE)。
示例:Java、.Net 等。与 OBP 相比,OOP 是新的OBP :遵循多态性和封装性。
示例:Ada、Visual Basic (VB) 和 Fortran 90。OBP 很旧【讨论】:
【参考方案7】:为了成为真正的面向对象语言,编程语言必须符合 4 个主要元素。它们是:抽象、封装、模块化和层次结构。
但是,如果支持第一个元素,我们可以调用基于语言对象。一旦编程语言支持对象的概念,它就本质上支持前三个元素,因为它们是对象的固有特征。
JavaScript 作为一种语言不能说是面向对象而是基于对象的语言,因为它不支持层次结构(尤其是继承)。
【讨论】:
【参考方案8】:仅使用对象并不意味着您正在执行 OOP,即使使用完全 OO 语言,如果您不实施 OO 技术,它也只是基于对象的编程。
【讨论】:
以上是关于面向对象和基于对象的语言之间的核心区别的主要内容,如果未能解决你的问题,请参考以下文章