由于没有有意义的术语的辩论是 无意义的, ,我想我应该指着房间里的大象问:到底是什么让语言“面向对象”?我在这里并不是在寻找教科书上的答案,而是根据您使用在您的领域(无论是什么领域)运行良好的 OO 语言的经验得出的答案。

可能有助于首先回答的一个相关问题是:面向对象语言的原型是什么?为什么?

有帮助吗?

解决方案

面向对象的定义 当然是一个 巨大的蠕虫罐头, ,但这是我的 2 美分:

对我来说,面向对象就是通过发送消息进行协作的对象。对我来说,这是面向对象语言最重要的一个特征。

如果我必须列出面向对象语言必须具备的所有功能的有序列表,它将如下所示:

  1. 向其他对象发送消息的对象
  2. 一切都是对象
  3. 后期绑定
  4. 亚型多态性
  5. 继承或类似的表达方式,例如 代表团
  6. 封装
  7. 信息隐藏
  8. 抽象

显然,这个列表是非常有争议的,因为它排除了许多被广泛认为是面向对象的语言,例如 爪哇, C#C++, ,所有这些都违反了第 1、2 和 3 点。然而,毫无疑问,这些语言允许面向对象编程(但也允许面向对象编程) C)甚至促进它(C 没有)。因此,我将满足这些要求的语言称为“纯粹面向对象”。

作为典型的面向对象语言,我将其命名为 自己新话.

两者均满足上述要求。两者都受到启发并成为其继承者 短暂聊天, ,并且在某种意义上两者实际上都做到了“更加面向对象”。我喜欢 Self 和新话的一点是,它们都将消息发送范式发挥到了极致(新话甚至比 Self 更重要)。

在新话中, 一切 是一条消息发送。没有实例变量,没有字段,没有属性,没有常量,没有类名。它们都是通过使用 getter 和 setter 来模拟的。

在自我中,有 没有课, ,仅对象。这强调了,什么是 OO 真的 关于:对象,而不是类。

其他提示

根据 Booch 的说法,以下要素:主要的:

  • 抽象
  • 封装
  • 模块化
  • 层次结构(继承)

次要的:

  • 打字
  • 并发性
  • 坚持

基本上,面向对象实际上可以归结为“消息传递”

在过程语言中,我调用这样的函数:

  f(x)

并且名称 f 可能在编译时绑定到特定的代码块。(除非这是一种具有高阶函数或函数指针的过程语言,但让我们暂时忽略这种可能性。)因此,这行代码只能表示一个明确的事情。

在面向对象的语言中,我将消息传递给对象,也许像这样:

 o.m(x) 

在这种情况下。m 不是代码块的名称,而是一个“方法选择器”,调用哪个代码块实际上在某种程度上取决于对象 o。这行代码更加模糊或笼统,因为它在不同情况下可能意味着不同的东西,具体取决于 o。

在大多数OO语言中,对象o有一个“类”,类决定调用哪个代码块。在一些面向对象语言(最著名的是 Javascript)中,o 没有类,但有在运行时直接附加到它的方法,或者从原型继承它们。

我的划分是,类和继承都不是面向对象语言所必需的。但这种消息的多态处理是必不可少的。

尽管您可以使用 C 语言中的函数指针来伪造这一点,但这不足以将 C 称为面向对象语言,因为您必须实现自己的基础结构。你可以做到这一点,并且 OO 风格是可能的,但语言还没有给你它。

真正的面向对象并不是语言,而是代码。

可以编写面向对象的 C 代码(如果您愿意,可以使用结构体甚至函数指针成员),并且我已经看到了一些非常好的示例。(我想到了 Quake 2/3 SDK。)也绝对可以编写程序(即非 OO)C++ 代码。

鉴于这一点,我会说这是语言对编写良好的OO代码的支持,使其成为“面向对象的语言”。例如,我永远不会在C中使用函数指针成员,例如,对于普通的成员函数而言;因此我会说C不是OO语言。

(扩展这一点,我们可以说 Python 也不是面向对象的,每个步骤都强制使用“self”引用,并且调用的构造函数 在里面, ,诸如此类;但这是一个宗教讨论。)

Smalltalk 通常被认为是原型的 OO 语言,尽管 Simula 经常被认为是第一个 OO 语言。

当前的面向对象语言可以根据借用最多概念的语言来粗略地分类:

  • 类似闲聊:Ruby、Objective-C
  • 类似模拟:C++、对象 Pascal、Java、C#

据我所知,使语言成为“面向对象”的主要观点是支持数据分组的思想以及处理该数据的方法,这通常是通过类、模块、继承、多态性等来实现的。

这次讨论 概述人们对面向对象的看法(想法?)。

至于“原型”OO 语言——正如 Kristopher 指出的那样,这确实是 Smalltalk。

支持类、方法、属性、封装、数据隐藏、继承、多态、抽象……?

抛开理论意义不谈,似乎

“任何具有名为‘class’的关键字的语言”:-P

为了进一步说明 aib 所说的,我想说一种语言并不是真正面向对象的,除非可用的标准库是面向对象的。最大的例子是 PHP。尽管它支持所有标准的面向对象概念,但事实上,很大一部分标准库不是面向对象的,这意味着几乎不可能以面向对象的方式编写代码。

如果所有标准库仍然要求您在所有函数调用前加上 mysql_ 和 pgsql_ 之类的前缀,那么它们引入命名空间并不重要,而在实际 API 中支持命名空间的语言中,您可以使用以下命令摆脱函数mysql_ 并在文件顶部有一个简单的“include system.db.mysql.*”,以便它知道这些东西来自哪里。

当你可以创建类时,它就是面向对象的
例如 :java 是面向对象的,javascript 不是,而 c++ 看起来像是某种“对对象好奇”的语言

根据我的经验,语言不是面向对象的,代码是。

几年前,当我开始理解面向对象时,我正在用 AppleScript 编写一套程序,它并没有真正强制执行任何面向对象的功能。用 AppleScript 编写对象是很笨拙的,尽管如果您花时间弄清楚如何创建类、构造函数等是可以的。

该语言是该域的正确语言:让 Macintosh 上的不同程序协同工作,根据输入文件完成一些自动任务。不厌其烦地自我实施面向对象的风格是正确的编程选择,因为它会使代码更容易排除故障、测试和理解。

在将代码从过程式更改为面向对象的过程中,我最注意到的功能是封装:属性和方法调用。

简单:(比较保险性质)

1-授生素2个疗法3封装4重复使用。:)

目的:对象是数据的存储库。例如,如果 MyList 是 ShoppingList 对象,则 MyList 可能会记录您的购物清单。

班级:类是一种对象类型。同一类的多个对象可能存在;例如,MyList 和 YourList 可能都是 ShoppingList 对象。

方法:对对象或类进行操作的过程或函数。方法与特定的类相关联。例如,addItem 可能是将项目添加到任何 ShoppingList 对象的方法。有时,一个方法与一系列类相关联。例如,addItem 可以对任何列表进行操作,而 ShoppingList 只是其中的一种类型。

遗产:类可以从更通用的类继承属性。例如,ShoppingList 类从 List 类继承存储项目序列的属性。

多态性:使一个方法调用适用于多个不同类的对象的能力,即使这些类需要方法调用的不同实现。例如,一行代码可能能够在每种列表上调用“addItem”方法,即使将项目添加到 ShoppingList 与将项目添加到 ShoppingCart 完全不同。

面向对象:每个对象都知道自己的类以及操作该类中的对象的方法。每个 ShoppingList 和每个 ShoppingCart 都知道 addItem 的哪个实现适用于它。

在此列表中,真正区分面向对象语言与过程语言(C、Fortran、Basic、Pascal)的一件事是多态性。

来源: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

我很高兴与大家分享这个,这对我来说非常有趣并且很有帮助。这是 1994 年滚石杂志采访的摘录,其中 Steve(不是程序员)用简单的术语解释了 OOP。

杰夫·古德尔:您能否简单地解释一下什么是面向对象软件?

史蒂夫·乔布斯:物体就像人一样。它们是活生生的、会呼吸的东西,它们内部有关于如何做事情的知识,并且内部有记忆,所以它们可以记住事情。您不是在非常低的级别与它们交互,而是在非常高的抽象级别与它们交互,就像我们在这里所做的那样。

这是一个例子:如果我是您的洗衣物体,您可以给我您的脏衣服,并给我发信息,说:“请给我的衣服洗衣服吗?”我碰巧知道旧金山最好的洗衣店在哪里。我会说英语,而且我口袋里有美元。于是我出去叫了一辆出租车,告诉司机带我去旧金山的这个地方。我去把你的衣服洗了,我跳回出租车,我回到这里。我给你干净的衣服并说:“这是你的干净的衣服。”

你不知道我是怎么做到的。你对洗衣房一无所知。也许你会说法语,但你甚至无法叫到出租车。你付不起钱,你的口袋里没有美元。然而,我知道如何做到这一切。而且你不必知道其中任何一个。所有这些复杂性都隐藏在我的内心,我们能够在非常高的抽象级别上进行交互。这就是对象。它们封装了复杂性,并且该复杂性的接口是高级别的。

原型

用代码表达现实世界场景的能力。

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[] 属性
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top