由于没有有意义的条款的辩论是meaningless,我想我会指出房间里的大象并问:究竟什么语言“面向对象”?我不是在寻找这里的教科书答案,而是根据你在你的领域中运作良好的OO语言的经验,无论它是什么。
可能有助于首先回答的相关问题是:面向对象语言的原型是什么?为什么?
答案 0 :(得分:29)
Definitions for Object-Orientation当然是huge can of worms,但这是我的2美分:
对我来说,面向对象是关于通过发送消息进行协作的对象。对我而言,这是面向对象语言最重要的一个特征。
如果我必须列出面向对象语言必须具备的所有功能的有序列表,它将如下所示:
显然,这个列表很有争议,因为它排除了被广泛认为是面向对象的各种各样的语言,例如Java,C#和C++,所有这违反了第1,2和3点。但是,毫无疑问,这些语言允许面向对象的编程(C也是如此),甚至可以促进它(C不支持)。所以,我开始称那些满足这些要求的语言“纯粹面向对象”。
作为典型的面向对象语言,我将其命名为Self和Newspeak。
两者都满足上述要求。两者都受到Smalltalk的启发和接替,并且在某种意义上它们实际上都成了“更多OO”。我喜欢Self和Newspeak的东西都是把信息传递到极端(Newspeak甚至比Self更多)。
在Newspeak中,所有内容都是一封消息发送。没有实例变量,没有字段,没有属性,没有常量,没有类名。它们都是通过使用getter和setter来模拟的。
在Self中,没有类,只有对象。这强调了OO 真正关于:对象,而不是类。
答案 1 :(得分:8)
根据Booch的说法,以下内容: 主要:
次要:
答案 2 :(得分:8)
基本上面向对象真的归结为“消息传递”
在过程语言中,我调用这样的函数:
f(x)
名称f可能在编译时绑定到特定的代码块。 (除非这是一个具有更高阶函数或函数指针的过程语言,但是让我们忽略这种可能性。)所以这行代码只能表示一个明确的事情。
在面向对象的语言中,我将消息传递给对象,可能是这样的:
o.m(x)
在这种情况下。 m不是代码块的名称,但是“方法选择器”和实际调用的代码块实际上以某种方式依赖于对象o。这行代码更加模糊或一般,因为它可能在不同的情况下表示不同的东西,具体取决于o。
在大多数OO语言中,对象o具有“类”,并且该类确定调用哪个代码块。在几种OO语言中(最着名的是Javascript)o没有类,但是在运行时直接附加到它的方法,或者从原型继承它们。
我的分界是,语言和OO都不需要类和继承。但这种多态的消息处理至关重要。
虽然您可以使用C语言中的函数指针伪装它,但这不足以将C称为OO语言,因为您将不得不实现自己的基础结构。你可以做到这一点,并且可以使用OO风格,但语言没有给你。
答案 3 :(得分:5)
这不是OO的语言,而是代码。
可以编写面向对象的C代码(如果你愿意,可以使用结构甚至函数指针成员),我已经看到了一些相当不错的例子。 (考虑到Quake 2/3 SDK。)在C ++中编写过程(即非OO)代码也是绝对可能的。
鉴于此,我会说这是语言支持编写好的OO代码,使其成为“面向对象的语言”。我永远不会在C中的结构中使用函数指针成员,例如,对于普通的成员函数;因此我会说C不是OO语言。
(扩展到这一点,可以说Python不是面向对象的,每个步骤都有强制性的“自我”引用,而构造函数叫做 init ,等等;但这是一个宗教讨论。 )
答案 4 :(得分:3)
Smalltalk通常被认为是原型OO语言,虽然Simula经常被认为是第一个OO语言。
当前的OO语言可以根据他们借用的最多概念语言进行松散的分类:
答案 5 :(得分:1)
据我所知,语法“面向对象”的主要观点是支持分组数据的想法,以及处理该数据的方法,这通常通过类,模块,继承,多态来实现等等。
请参阅this discussion,了解人们的想法(思考?),面向对象意味着。
至于“原型”OO语言 - 正如克里斯托弗指出的那样,确实是Smalltalk。
答案 6 :(得分:0)
支持类,方法,属性,封装,数据隐藏,继承,多态,抽象......?
答案 7 :(得分:0)
无视理论含义,似乎是
“任何具有关键字'class'的语言”:-P
答案 8 :(得分:0)
为了进一步说明aib所说的,我会说除非可用的标准库是面向对象的,否则语言并不是面向对象的。最好的例子是PHP。虽然它支持所有标准的面向对象概念,但是如此大部分标准库不是面向对象的事实意味着以面向对象的方式编写代码几乎是不可能的。
如果所有标准库仍然要求您使用mysql_和pgsql_之类的函数为所有函数调用添加前缀,那么它们引入命名空间并不重要,当使用支持实际API中的命名空间的语言时,您可以摆脱它们使用mysql_的函数,并在文件顶部只有一个简单的“include system.db.mysql。*”,以便知道这些内容来自何处。
答案 9 :(得分:0)
当你可以上课时,它是面向对象的 例如:java是面向对象的,javascript不是,而c ++看起来像某种“对象好奇”的语言
答案 10 :(得分:0)
根据我的经验,语言不是面向对象的,代码是。
几年前,我在AppleScript中编写了一套程序,当我开始使用OO时,它并没有真正强制执行任何面向对象的功能。在AppleScript中编写对象很笨拙,尽管如果你花时间弄清楚如何创建类,构造函数等,也是可能的。
该语言是域的正确语言:在Macintosh上获取不同的程序,以便根据输入文件完成一些自动任务。煞费苦心地实现面向对象的风格是正确的编程选择,因为它导致代码更容易进行故障排除,测试和理解。
我注意到在将这些代码从过程更改为OO时最常见的功能是封装:属性和方法调用。
答案 11 :(得分:0)
简单:(比较保险字符)
1-多态性 2,继承 3封装 4-再利用。 :)
答案 12 :(得分:0)
对象:对象是数据的存储库。例如,如果MyList是ShoppingList对象,则MyList可能会记录您的购物清单。
类:类是一种对象。可能存在同一类的许多对象;例如,MyList和YourList都可能是ShoppingList对象。
方法:对对象或类进行操作的过程或函数。方法与特定类相关联。例如,addItem可能是一个将项添加到任何ShoppingList对象的方法。有时,方法与一类类相关联。例如,addItem可以在任何List上运行,其中ShoppingList只是一种类型。
继承:类可以从更通用的类继承属性。例如,ShoppingList类从List类继承存储一系列项的属性。
多态性:让一个方法调用在几个不同的对象类上工作的能力,即使这些类需要不同的方法调用实现。例如,一行代码可能能够调用" addItem"即使向ShoppingList添加项目与将项目添加到ShoppingCart完全不同,也可以在每种List上进行方法。
面向对象:每个对象都知道自己的类,以及哪些方法操纵该类中的对象。每个ShoppingList和每个ShoppingCart都知道addItem的哪个实现适用于它。
在这个列表中,真正区分面向对象语言和过程语言(C,Fortran,Basic,Pascal)的一件事是多态性。
来源:https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd
答案 13 :(得分:0)
我很高兴与大家分享这件事,这对我来说非常有趣并且对我有帮助。这是1994年滚石专访中的摘录,史蒂夫(不是程序员)用简单的术语解释了OOP。
Jeff Goodell:您能简单地解释一下什么是面向对象的软件吗?
史蒂夫·乔布斯:对象就像人。他们在生活,呼吸着对自己有做事知识的事物,并在其中拥有记忆,以便他们能够记住事物。而且,与其在非常低的层次上进行交互,不如在我们这里所做的那样,以非常高的抽象级别与它们进行交互。
这里是一个例子:如果我是您的洗衣对象,则可以给我您的脏衣服,并给我发送一条消息,说:“请给我洗衣服。”我碰巧知道最好的洗衣店在哪里在旧金山是。而且我会说英语,并且口袋里有美元。所以我出去叫出租车,叫司机带我去旧金山这个地方。我去洗衣服,跳回出租车,回到这里。我给你你的干净衣服,说:“这是你的干净衣服。”
你不知道我是怎么做到的。您不知道洗衣地点。也许您会说法语,甚至不能叫出租车。您无法支付任何费用,口袋里没有美元。但是,我知道该怎么做。而且您无需了解任何内容。所有这些复杂性都隐藏在我体内,我们能够以很高的抽象水平进行交互。那就是物体。它们封装了复杂性,并且解决该复杂性的接口是高级的。
答案 14 :(得分:0)
如果一种语言被设计为专门支持面向对象编程(4 个特性),那么它就是一种面向对象的编程语言。
您或多或少可以使用任何语言以面向对象的风格进行编程。面向对象的是代码而不是语言。
真正的面向对象语言的例子有 Java、c#、Python、Ruby、C++。 此外,还可以通过扩展来提供面向对象的功能,例如 PHP、Perl 等。
您可以用 C 编写面向对象的代码,但它不是面向对象的程序。朗。它不是为此而设计的(这是 C++ 的全部内容)
答案 15 :(得分:-2)
<强>原型强>
能够在代码中表达真实场景。
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);
}
}
<强>为什么吗
帮助我们更轻松地理解这一点。它在我们的头脑中更有意义,如果正确实施,可以使代码更有效,可重复使用并减少重复。
要实现这一目标,您需要: