【问题标题】:Main concepts in OOPOOP 中的主要概念
【发布时间】:2008-12-31 13:48:00
【问题描述】:

我曾经在一次采访中被问到“OOP 的 3 个主要概念是什么?”。 我的回答是,我认为有以下 4 个:

  • 继承
  • 封装
  • 抽象
  • 多态性

我说的对吗?

【问题讨论】:

标签: oop language-agnostic


【解决方案1】:

语言要面向对象有 3 个要求:

  • 只支持封装(对象)的语言不是面向对象的,但它是模块化的
  • 仅支持封装(对象)和消息传递(多态)的语言不是面向对象的,而是基于对象的
  • 一种支持封装(对象)、消息传递(多态性)和继承(抽象)的语言,面向对象的

注意:抽象是一个更笼统的概念;封装等是抽象的,就像子程序是一种抽象一样。见Abstraction

【讨论】:

  • 一个很好的答案,当然得到了我的投票。您可以通过为上述每个示例添加几个示例来改进它。
  • 这些不构成面向对象的语言,具有所有这些东西的语言只是支持面向对象的语言。真正面向对象的语言是这些东西深深地嵌入到语言中的语言。
  • @[Rene Saarsoo]:请定义区别。
  • 是的,大多数编程语言都无法阻止您编写庞大的非结构化单片代码块。更糟糕的是,有些人这样做;)
  • 多态性如何等同于消息传递
【解决方案2】:

我会说抽象不仅仅是一个 OOP 概念,因为您可以在很大程度上抽象许多非 OOP 语言。

【讨论】:

  • 抽象在我看来是其中最重要的部分。
  • 我还学习了封装、继承和多态性。我当然知道抽象是什么,但是“抽象”如何应用于 OOP 而不是过程语言?
  • @Filip,我同意它是许多编程中最重要的部分,但我认为它是 OOP 独有的。一旦您可以创建自己的函数和过程来解决高级域特定任务,您就可以定义抽象。
  • 我同意:说抽象是OOP的原则就像说图灵完备是OOP的原则。当然,这是真的,但如果有必要,你可以不言而喻地放手,而且不会造成任何伤害。
  • 没有抽象你可以做什么样的编程?
【解决方案3】:

四大支柱是你正确的状态

  • 封装。
  • 抽象
  • 继承
  • 多态性

封装处理包含数据,仅此而已。

抽象处理数据抽象,即所有这些数据是否真正相关。想象一家银行,其中包含姓名、年龄、地址、眼睛颜色、最喜欢的领带等信息。眼睛颜色和最喜欢的领带真的与银行的要求相关吗?不,这是抽象。

继承处理泛化。可以应用于不止一件事的信息。如果某物从某物继承,则可以说它是该物的更具体类型。例如,动物。 Dog 是 Animal 的一种,所以 Dog 继承自 Animal。 Jack Russell 是 Dog 的一种,所以 Jack Russell 继承自 Dog。

多态性处理具有多种形式的事物(poly - morph)。 编程中的两种,

  • 后期绑定,
  • 您将某些东西称为通用类型,因此编译器不知道在编译时要绑定什么。想想方法覆盖。

  • 早期绑定

  • 您使用不同的签名重新定义方法,即 int add(int a, int b) vs double add(double a, double b)

这些本质上是面向对象的基本原则。它们之间有很多重叠之处,因此清楚地理解它们各自的含义非常重要。

【讨论】:

    【解决方案4】:

    OOP 的问题在于没有人费心给出一个正确、简洁、一致同意的定义。特别是,我想指出的是,您提到的所有方面都可以在不使用面向对象的情况下付诸实施!

    执行此操作的两个类型系统是 Haskell 类型系统,按照共识,它通常不被视为面向对象,以及具有模板子类化的 C++ 模板。然而,可能有人认为模板子类化模拟了 OOP。

    由于模板子类化不是一种广为人知的机制,让我举一个来自SeqAn library 的例子。

    String<Char> cstr = "This is a test";
    String<Dna, Packed<> > dstr = "GATTACA";
    
    cout << "length(" << cstr << ") = " << length(cstr) << endl;
    cout << "length(" << dstr << ") = " << length(dstr) << endl;
    

    这里,String&lt;Char&gt;String&lt;Dna, Packed&lt;&gt; &gt;继承抽象类”String&lt;&gt;。他们封装字符串的概念,使用完全不同的方法。它们共享 多态 length 方法,两种具体类型的实现方式不同。

    【讨论】:

    • 模板模拟 OOP;它们提供简洁的语法,但它们不重用代码。相反,他们扩展和膨胀代码;-)
    • 你所描述的,其实在《C++模板完整指南》中叫做静态多态。
    • @Comptrol:不,这是另一回事。模板子类化通过基类建立了继承层次结构,实际上具有 OOP 的几个附加属性(代码重用)。静态多态没有这个,它只是先验无关类型之间的一种特殊关系。
    【解决方案5】:

    这就是我认识的四骑士。也许他们错误地将继承和多态混为一谈。

    【讨论】:

    • 确实如此。确实有 \pi 主要概念 - 我从来没有得到正确的分数。
    【解决方案6】:

    是的,这些是标准的四个。

    有些人将抽象和封装结合起来。我不确定为什么......它们不是完全正交的,但也许有足够的重叠?继承和多态之间肯定有重叠,但在我看来,很难将它们结合起来。

    【讨论】:

      【解决方案7】:

      大多数人会认为这是正确的,我猜如果他们要求三个,那就是继承、封装和多态。

      我个人认为这三个概念是真正的“肉”,如果你会支持 OOP 的定义的话。大多数人认为抽象是理所当然的,并将其与其他人混为一谈,因为它实际上可以被视为其他三个中的任何一个的一部分。

      当我谈到 OOP 时,虽然我总是提到 4。

      【讨论】:

      • 我会发现很难省略“抽象”。这是“新的”领域驱动设计背后的推动力的一部分……创建尽可能紧密地模拟世界的抽象。
      • 我同意 Mitchel 的观点,我经常听到人们将封装和抽象混为一谈。
      • @Mark - 我同意,作为一名讲师,我强调这四点,但遗憾的是,并非所有人都强调抽象,有些人认为它“就在那里”。
      • 我想这取决于您学习编程的方式和时间。早在接近 OOP 之前,我就使用 BASIC、assmebler、Pascal、FORTH 和 C 进行了编程,而良好的抽象始终是设计目标。 OOP 的其他三个方面只是简单地结合起来以实现更好的抽象。
      【解决方案8】:

      可能最后三个是他们正在寻找的 - 可以认为继承更多地是一种帮助实现其他更高层次目标的机制。

      无论如何都没有真正正确的答案,尤其是如果仅限于“前 3 名”。

      【讨论】:

        【解决方案9】:

        没错。

        如果你只需要提供一个抽象,那么它必须是,因为,一种或另一种方式,其余三个只是抽象在行动

        【讨论】:

          【解决方案10】:

          OOP 中的三个主要概念:

          • 后期绑定
          • 概念重用(无论如何都不确定:重用概念;避免重新实现即使是最简单的概念)
          • 抽象

          【讨论】:

          • 这是smalltalk的主要特点,也是smalltalk提供的那种OOP的主要特点。
          【解决方案11】:

          对这个问题的正确答案是:“请阐明你的意思是什么面向对象编程。”糟糕,这很能说明问题,因为被问到的真正问题是:“当我说 OOP 时,我的意思是什么?”

          没有正确答案。

          【讨论】:

            【解决方案12】:

            哎呀

            抽象(忽略或隐藏无关紧要的细节) - 主题非常笼统且不基于真实情况的情况。

            封装 - 在类内部保持属性和方法私有,因此无法从类外部访问它们。

            ! API - 本质上是所有非私有、未封装的方法。

            继承 - 使某个类的所有属性和方法对子类可用。

            Polymorphism-gr:“许多形状” - 子类可以覆盖它从父类继承的方法。

            【讨论】:

              【解决方案13】:

              这篇 [article][1] 提到了优秀代码的三大支柱。我发现这是一篇很好的文章,它认为封装是面向对象设计的“第一原则”。

              “第一”原则是基本的、基本的原则,其他一切都源于此。作者以黄金法则为例。教孩子文明行为的所有细节是很困难的,但如果你能让他们理解(更重要的是,实践)以你希望被对待的方式对待他人的黄金法则,那么他们更有可能“得到”我们每天都要遵守的所有法律和道德标准。

              因此,如果开发人员将封装理解为面向对象开发的“第一原则”,那么所有其他原则都会在适当的时候遵循。

              我不公正作者的内容,但我肯定会鼓励人们阅读它。

              出于某种原因,我没有显示超链接,所以这里是 URL:http://www.netobjectives.com/files/Encapsulation_First_Principle_Object_Oriented_Design.pdf

              【讨论】:

                【解决方案14】:

                这可能是面试的一个技巧问题,但这些天在计算机科学课程中,他们教授面向对象编程的 4 个支柱。

                【讨论】:

                  【解决方案15】:

                  通常认为这些是主要原则,但它们与创建 OO 的原因几乎没有关系。

                  指导原则之一是直接操纵隐喻。那就是在程序中创建一个对象,该对象代表用户心智模型中的一个对象。创建 OO 的大部分动机是基于心理学,而不是如今人们通常认为的数学/CS。

                  如果对此有疑问,请查看 Trygve Renskauge 的一些作品。 MVC 和 DCI 之父或 James Coplien 成就了作家和演讲者。

                  所以我想说你给他们的答案可能接近他们预期的答案,是否正确取决于你的立场。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多