关于oop:是什么使语言成为面向对象的语言?

关于oop:是什么使语言成为面向对象的语言?

What makes a language Object-Oriented?

由于没有有意义的术语的辩论是没有意义的,我想我会指着房间里的大象问:到底是什么使语言成为"面向对象"? 我不是在这里寻找教科书的答案,而是根据您对OO语言的经验而定的答案,无论您使用哪种OO语言都可以在您的域中很好地工作。

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


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

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

如果我必须列出面向对象语言必须具有的所有功能的有序列表,则它将看起来像这样:

  • 向其他对象发送消息的对象
  • 一切都是对象
  • 后期绑定
  • 亚型多态性
  • 继承或类似表达的东西,例如委托
  • 封装形式
  • 信息隐藏
  • 抽象化
  • 显然,此列表引起很大争议,因为它排除了被广泛认为是面向对象的多种语言,例如Java,C#和C ++,所有这些语言都违反了第1、2和3点。但是,毫无疑问这些语言允许进行面向对象的编程(但是C允许),甚至可以简化它(C不允许)。因此,我将满足这些要求的语言称为"纯粹面向对象"。

    作为典型的面向对象语言,我将其命名为Self和Newspeak。

    两者都满足上述要求。两者均受Smalltalk的启发和继承,并且从某种意义上说,两者实际上都是"更多面向对象的"。我喜欢Self和Newspeak的地方在于,它们都将发送范例的信息发挥到了极致(Newspeak比Self更是如此)。

    在Newspeak中,一切都是消息发送。没有实例变量,没有字段,没有属性,没有常量,没有类名。它们都使用getter和setter进行仿真。

    在Self中,没有类,只有对象。这强调了OO的真正含义:对象,而不是类。


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

    用一种过程语言,我这样调用一个函数:

    1
      f(x)

    并且名称f可能在编译时绑定到特定的代码块。 (除非这是一种具有高阶函数或函数指针的过程语言,但让我们一秒钟忽略这种可能性。)因此,这行代码仅意味着一句话。

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

    1
     o.m(x)

    在这种情况下。 m不是代码块的名称,而是一个"方法选择器",而调用哪个代码块实际上在某种程度上取决于对象o。此代码行比较含糊或笼统,因为根据o的不同情况,它可能表示不同的含义。

    在大多数OO语言中,对象o具有"类",并且该类确定调用哪个代码块。在几种OO语言(最著名的是Javascript)中,o没有类,但是在运行时直接将其附加到方法上,或者从原型继承了它们。

    我的分界是,语言成为OO不需要类或继承。但是,消息的这种多态处理是必不可少的。

    尽管您可以使用C语言中的函数指针来伪造它,但是对于将C称为OO语言而言,这还不够,因为您将必须实现自己的基础结构。您可以执行此操作,并且可以使用OO样式,但是该语言尚未提供给您。


    根据Booch所说,以下要素:
    重大的:

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

    次要:

    • 打字
    • 并发
    • 坚持不懈

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

    可以编写面向对象的C代码(如果需要,可以使用结构甚至函数指针成员),而且我已经看到了一些很好的示例。 (我想到了Quake 2/3 SDK。)当然也可以用C ++编写过程代码(即非OO)。

    鉴于此,我想说的是该语言对编写出色的OO代码的支持,使之成为"面向对象的语言"。例如,对于普通的成员函数,我永远不会在C的结构中使用函数指针成员。因此,我将说C不是OO语言。

    (对此进行扩展,可以说Python也不是面向对象的,在每个步骤上都带有强制性的"自我"引用,而名为init的构造函数,不然,但这是一个宗教讨论。)


    尽管经常将Simula称为第一类OO语言,但是Smalltalk通常被视为原型OO语言。

    当前的OO语言可以从它们借用最多概念的语言中大致分类:

    • 类似于Smalltalk的语言:Ruby,Objective-C
    • 类似Simula:C ++,Object Pascal,Java,C#

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

    请参阅此讨论以了解人们对(面向对象)面向对象的含义的概述。

    至于"原型" OO语言-实际上就是Smalltalk,正如Kristopher指出的那样。


    我很高兴与大家分享这一点,这很有趣,对我也有帮助。这是1994年Rolling Stone采访中的摘录,其中Steve(不是程序员)用简单的术语解释了OOP。

    Jeff Goodell:您能简单地解释一下什么是面向对象的软件吗?

    史蒂夫·乔布斯:对象就像人。他们在生活,呼吸着对自己有做事知识的事物,并在其中拥有记忆,以便他们能够记住事物。与其以非常低的层次进行交互,不如以我们在此处所做的那样以很高的抽象层次与它们进行交互。

    举个例子:如果我是您的洗衣对象,您可以给我您的脏衣服,并给我发送一条信息,说:"请给我洗衣服。"我碰巧知道旧金山最好的洗衣场所在哪里是。而且我会说英语,并且口袋里有美元。所以我出去叫出租车,叫司机带我去旧金山这个地方。我去洗衣服,跳回出租车,回到这里。我给你洗衣服,说:"这是你的洗衣服。"

    你不知道我是怎么做到的。您不知道洗衣地点。也许您会说法语,甚至不能叫出租车。您无法支付任何费用,口袋里没有美元。但是,我知道该怎么做。而且您无需了解任何内容。所有这些复杂性都隐藏在我体内,我们能够以很高的抽象水平进行交互。那就是物体。它们封装了复杂性,并且解决该复杂性的接口是高级的。


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

    类:类是一种对象。可能存在许多相同类的对象。例如,MyList和YourList都可以是ShoppingList对象。

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

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

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

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

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

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


    简单:(比较保险字符)

    1-多态
    2继承
    3封装
    4-重复使用。
    :)


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

    几年前,当我开始使用OO时,我正在用AppleScript编写一套程序,但实际上并没有实施任何面向对象的功能。尽管可以花时间弄清楚如何创建类,构造函数等,但是用AppleScript编写对象很笨拙。

    该语言是该域的正确语言:在Macintosh上使不同的程序协同工作以完成基于输入文件的某些自动任务。麻烦自行实施面向对象的样式是正确的编程选择,因为这样可以使代码更易于故障排除,测试和理解。

    在将代码从程序更改为OO时,我最注意到的功能是封装:属性和方法调用。


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


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

    如果所有标准库仍要求您为所有函数调用添加mysql_和pgsql_之类的前缀,那么它们引入了名称空间并不重要,当使用实际API中支持名称空间的语言时,您可以使用mysql_,并且在文件顶部仅包含一个简单的" include system.db.mysql。*",以便它知道这些内容来自何处。


    不管理论意义如何,似乎

    "任何具有关键字'class'的语言" :-P


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


    原型

    用代码表达真实场景的能力。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    foreach(House house in location.Houses)
    {
     foreach(Deliverable mail in new Mailbag(new Deliverable[]
                  {
                  GetLetters(),
                  GetPackages(),
                  GetAdvertisingJunk()
                  })
     {
        if(mail.AddressedTo(house))
        {
            house.Deliver(mail);
        }
     }
    }

    --

    1
    2
    3
    4
    5
    6
    7
    8
    foreach(Deliverable myMail in GetMail())
    {
        IReadable readable = myMail as IReadable;
        if ( readable != null )
        {
            Console.WriteLine(readable.Text);
        }
    }

    为什么?

    为了帮助我们更容易地理解这一点。它在我们的脑海中有更好的意义,如果正确实施,则可使代码更高效,可重复使用并减少重复。

    为此,您需要:

    • 指针/引用以确保this == this和this!= that。
    • 指向存储数据(int毛羽)和操作(Throw(IThrowable))的类(例如Arm)
    • 多态(继承和/或接口)以通用方式处理特定对象,因此您可以在墙上阅读书籍和涂鸦(均实现IReadable)
    • 封装是因为苹果没有公开Atoms []属性


    推荐阅读

      AMD平台专业术语

      AMD平台专业术语,,1. AMD VISION技术 AMD公司曾经发布过的一份调查报告显示,消费者推迟购买硬件是由于他们对PC术语感到困惑。因此,AMD公

      笑笑看西卡电脑的片子|我想看卡西

      笑笑看西卡电脑的片子|我想看卡西,,1. 我想看卡西个人喜欢的电影排名①肖申克的救赎理由:很多年前曾经看过一次,理解为男主复仇励志片。再次

      探探语言设置|探探怎么设置语言

      探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

      git设置编码|git语言设置

      git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高

      区域语言设置|区域语言设置工具

      区域语言设置|区域语言设置工具,,区域语言设置工具你好,大致的方法如下,可以参考:1、按下键盘的windows 图标,再开始菜单中单击“设置”;出现的

      c4d语言设置|c4d汉语设置

      c4d语言设置|c4d汉语设置,,1. c4d汉语设置mac版的C4D是这样的,中文字体是有的,但是是以拼音的形式存在,比如黑体就是ht。中文字体以拼音方式

      电脑宣传语|电脑宣传语言

      电脑宣传语|电脑宣传语言,,1. 电脑宣传语言1.我做好了与你过一辈子的打算,也做好了你随时要走的准备,2.每段青春都会苍老,但我希望记忆里的你

      office语言设置|微软office语言设置

      office语言设置|微软office语言设置,,微软office语言设置一、首先点击桌面左下角“WIN键”。二、弹出选项内点击“所有程序”。三、接着点

      小米设置日语|小米设置日语语言

      小米设置日语|小米设置日语语言,,1. 小米设置日语语言MIUI系统文字目前只支持简体中文、繁体中文、英文、藏文和维吾尔文,不支持日文 2. 小