是什么使语言成为面向对象的语言?
由于没有有意义的术语的辩论是没有意义的,我想我会指着房间里的大象问:到底是什么使语言成为"面向对象"?我不是在这里寻找教科书的答案,而是根据我们对OO语言的经验而定的答案,无论我们使用哪种OO语言都可以在域中很好地工作。
一个可能有助于首先回答的相关问题是:面向对象语言的原型是什么?为什么?
解决方案
回答
支持类,方法,属性,封装,数据隐藏,继承,多态,抽象...?
回答
根据Booch的说法,以下要素:
主要的:
- 抽象化
- 封装形式
- 模块化
- 层次结构(继承)
次要的:
- 打字
- 并发
- 坚持不懈
回答
尽管经常将Simula称为第一类OO语言,但Smalltalk通常被认为是原型OO语言。
当前的OO语言可以从它们借用最多概念的语言中粗略分类:
- 类似于Smalltalk的语言:Ruby,Objective-C
- 类似于Simula的语言:C ++,Object Pascal,Java,C#
回答
原型
用代码表达真实场景的能力。
foreach(House house in location.Houses) { foreach(Deliverable mail in new Mailbag(new Deliverable[] { GetLetters(), GetPackages(), GetAdvertisingJunk() }) { if(mail.AddressedTo(house)) { house.Deliver(mail); } } }
--
foreach(Deliverable myMail in GetMail()) { IReadable readable = myMail as IReadable; if ( readable != null ) { Console.WriteLine(readable.Text); } }
为什么?
为了帮助我们更容易地理解这一点。它在我们的脑海中有更好的意义,如果正确实施,则可使代码更高效,可重复使用并减少重复。
为此,我们需要:
- 指针/引用以确保this == this和this!= that。
- 指向(例如Arm)的类别,用于存储数据(int hairyness)和操作(Throw(IThrowable))
- 多态(继承和/或者接口)以通用方式处理特定对象,因此我们可以在墙上阅读书籍和涂鸦(均实现IReadable)
- 封装是因为苹果没有公开Atoms []属性
回答
面向对象的定义当然是一大堆蠕虫,但这是我的2美分:
对我而言,面向对象就是所有通过发送消息进行协作的对象。对我来说,这就是面向对象语言的最重要的特征。
如果我必须列出面向对象语言必须具备的所有功能的有序列表,则它将看起来像这样:
- 向其他对象发送消息的对象
- 一切都是对象
- 后期装订
- 亚型多态性
- 继承或者类似表达的东西,例如委托
- 封装形式
- 信息隐藏
- 抽象化
显然,此列表引起很大争议,因为它排除了被广泛认为是面向对象的多种语言,例如Java,Cand C ++,所有这些语言都违反了第1、2和3点。但是,毫无疑问,这些语言允许进行面向对象的编程(但是C允许),甚至可以简化编程(C则不能)。因此,我将满足这些要求的语言称为"纯粹面向对象"。
作为典型的面向对象语言,我将其命名为Self和Newspeak。
两者都满足上述要求。两者都受到Smalltalk的启发和继承,并且从某种意义上说,两者实际上都是"更多面向对象的"。我喜欢Self和Newspeak的地方在于,它们都将信息发送范式带到了极致(Newspeak比Self更是如此)。
在Newspeak中,一切都是消息发送。没有实例变量,没有字段,没有属性,没有常量,没有类名。它们都使用getter和setter进行仿真。
在Self中,没有类,只有对象。这强调了OO的真正含义:对象,而不是类。
回答
据我所知,使语言"面向对象"的原因的主要观点是支持对数据进行分组的思想以及对数据进行工作的方法,这通常是通过类,模块,继承,多态性等来实现的。
请参阅此讨论以了解人们对(面向对象)面向对象的含义的概述。
正如Kristopher所指出的那样,对于"原型" OO语言而言,确实是Smalltalk。
回答
不是真正的面向对象的语言,而是代码。
可以编写面向对象的C代码(如果需要,可以使用结构甚至函数指针成员),而且我已经看到了一些很好的示例。 (我想到了Quake 2/3 SDK。)使用C ++编写过程(即非OO)代码绝对是可能的。
鉴于此,我想说这是该语言对编写出色的OO代码的支持,使它成为"面向对象的语言"。例如,对于普通的成员函数,我永远不会在C的结构中使用函数指针成员。因此,我将说C不是OO语言。
(对此进行扩展,可以说Python也不是面向对象的,在每个步骤上都带有强制性的"自我"引用,而调用了init的构造函数,诸如此类;但这是一个宗教性的讨论。)
回答
撇开理论意义,似乎是
"任何具有关键字" class"的语言" :-P
回答
进一步讲一下aib所说的话,除非可用的标准库都是面向对象的,否则语言并不是真正面向对象的。最大的例子是PHP。尽管它支持所有标准的面向对象的概念,但事实是很大一部分标准库不是面向对象的,这意味着几乎不可能以面向对象的方式编写代码。
如果所有标准库仍然要求我们为所有函数调用加上mysql_和pgsql_之类的前缀,则它们引入了名称空间并不重要,当使用实际API中支持名称空间的语言时,可以使用mysql_,并且在文件顶部仅包含一个简单的" include system.db.mysql。*",以便它知道这些内容来自何处。
回答
基本上,面向对象实际上可以归结为"消息传递"
用一种过程语言,我这样调用一个函数:
f(x)
并且名称f可能在编译时绑定到特定的代码块。 (除非这是一种具有高阶函数或者函数指针的过程语言,但让我们一秒钟忽略这种可能性。)因此,这一行代码仅意味着一句话。
在面向对象的语言中,我将消息传递给对象,也许像这样:
o.m(x)
在这种情况下。 m不是代码块的名称,而是一个"方法选择器",而调用哪个代码块实际上在某种程度上取决于对象o。此代码行比较含糊或者笼统,因为根据o的不同情况,它可能表示不同的情况。
在大多数OO语言中,对象o具有一个"类",并且该类确定调用哪个代码块。在几种OO语言(最著名的是Javascript)中,o没有类,但是在运行时直接将其添加到方法上,或者从原型继承了它们。
我的分界是,语言成为OO既不需要类也不必继承。但是,消息的这种多态处理是必不可少的。
尽管我们可以使用C语言中的函数指针来伪造它,但是对于将C称为OO语言而言,这还不够,因为我们将必须实现自己的基础结构。我们可以执行此操作,并且可以使用OO样式,但是该语言尚未提供给我们。
回答
当我们可以创建类时,它是面向对象的
例如:java是面向对象的,javascript不是,c ++看起来像某种"对象好奇"的语言
回答
以我的经验,语言不是面向对象的,代码不是。
几年前,当我开始使用OO时,我正在用AppleScript编写一套程序,但实际上并没有实施任何面向对象的功能。尽管可以花时间弄清楚如何创建类,构造函数等,但是用AppleScript编写对象很笨拙。
该语言是该域的正确语言:在Macintosh上使不同的程序协同工作以完成基于输入文件的某些自动任务。麻烦自行实施面向对象的样式是正确的编程选择,因为它使代码更易于故障排除,测试和理解。
在将代码从程序更改为OO时,我最注意到的功能是封装:属性和方法调用。