【问题标题】:Is inheritance necessary for encapsulation, abstraction and polymorphism?封装、抽象和多态是否需要继承?
【发布时间】:2016-08-01 19:55:57
【问题描述】:

今天我接受了软件工程职位的面试。我已经从 stackoverflow 中阅读了很多关于面试的内容。他们向我询问了与 OOP 相关的正常情况。但他们也问我这些:

没有继承是否可以封装?

没有继承就可以抽象吗?

没有继承是否可以实现多态性?

我已经根据我对 OOP 的了解回答了这些问题。我不知道是对是错。谁能用一些相关的例子告诉我这些的正确答案。

谢谢

【问题讨论】:

    标签: oop inheritance polymorphism encapsulation abstraction


    【解决方案1】:
    • 是否可以在没有继承的情况下进行封装?

    是的,因为封装是通过访问方法向外界隐藏类属性的能力。

    • 没有继承就可以进行抽象吗?

    嗯,抽象可以指很多东西,但谈到 OOP: 不可以,抽象类不能直接使用,只能实例化继承的类。

    • 没有继承就可以实现多态性吗?

    是的,多态性是对多种类型对象的单个接口的构造,例如,可以接收不同类或数据类型作为参数的单个函数调用。它们可以被继承,也可以不被继承。

    【讨论】:

    • 所以,在封装中。你是说你有一个类,其中你有所有的方法,你想对外界隐藏它?正确的?那么你的访问方法在哪里?如果是同一个班?那么他们不是没有隐藏吗?
    • 我的意思是你想对外界隐藏类或实例的属性,所以你构建方法(setter、getter 等)以避免直接访问它们。这就是封装。
    • “等”部分是必不可少的。有些人认为封装只是提供 getter 和 setter,而没有意识到它实际上是将数据及其相关行为(即使用该数据的方法)捆绑在一起。 http://www.javaworld.com/article/2075271/core-java/encapsulation-is-not-information-hiding.html
    【解决方案2】:

    如果没有继承,封装绝对是可能的。封装是隐藏数据的概念,这些数据不应该能够被外部对象操作。封装的一个例子是 Java 中对象的私有字段。然后,您可以使用公共方法(例如 getter 和 setter,或其他计算方法)仅在需要时操作数据。

    然而,抽象和多态与继承直接相关。

    抽象是指你去掉一个对象的实现细节并创建一个抽象类或接口(用 Java 来说)。这将作为任何实现或继承类需要包含在详细实现中的合同。抽象类将有方法签名,但没有主体;继承类将实现主体。

    多态性是以不同形式实现抽象事物的能力。例如,如果您有一个名为 Animal 的抽象类,其中包含一个 speak() 方法,您可以创建一个继承自 Animal 的 Dog 类并实现 speak() 以打印“woof”,而 Cat() 类将实现 speak( ) 打印“喵”。

    请注意,它确实取决于正在检查的多态性类型。如另一个答案所述,您可以具有方法/函数参数多态性,并且如上所述,无需继承即可。

    【讨论】:

      【解决方案3】:

      嗯,我的理解:

      • 封装只是防止直接修改 实例的状态,即使没有OOP也可以完成。

      • 抽象是类(对象模板)的泛化,它不能 无需继承即可完成。它侧重于共同合同条款。

      • 多态意味着相同的动作但不同的行为。通常它 与抽象/接口一起使用。没有OOP就无法做到

      【讨论】:

      • 没有 OOP 还是没有继承?
      • 没有继承,是的,即使没有 OOP。
      【解决方案4】:
      • Encapsulation可以在没有继承的情况下

        只需将私有属性添加到类并使用 setter 和 getter 来访问此属性。

      • Abstraction 本身是可能没有继承: 您可以将类抽象化,并且不需要任何继承。

      如果问的问题是:可以在没有抽象类的情况下使用 继承?

      那么不,没有继承就不能使用它,因为它需要先实例化,因此需要继承。但是抽象本身不需要继承。

      • Polymorphism 没有继承是不可能的:这是因为这两种类型的对象之间的多态性必须有一些共同点才能起作用。这甚至可以通过 Object 类在 java 的情况下变得简单,所有类都派生自该类。

      【讨论】:

      • 这完全取决于语言。例如,在 Smalltalk 中,您可以在没有继承的情况下实现多态性,因为 Smalltalk 是一种后期绑定语言,它允许您将两个对象视为相同,只要它们都实现相同的方法(包括签名)
      • 很高兴知道。所以在指定语言之前,这个问题没有正确答案?
      【解决方案5】:

      所有三个问题的答案都是肯定的,可以在没有继承的情况下执行它们,但真正的答案是“这取决于实现它们的语言”。

      我的意思是,考虑到第一个 C++ 编译器实际上将其代码编译为标准 C,这不是 OOP 语言。显然,代码必须编译成不支持继承的语言。

      【讨论】:

        【解决方案6】:

        我会说

        封装 - 是的。例如,一个函数操作在其中声明的静态变量(如在 c++ 中)。或者 c 代码对其他编译单元隐藏未导出的变量和函数。

        抽象 - 是的。 c++ 中的“概念”就是一个例子。在 c++ 中,您可以编写一个例程并说“只要参数类型定义了小于运算符,这段代码就可以编译”。

        多态性 - 是的。一个简单的函数指针可以用来提供一个可插入的实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-18
          • 2016-11-05
          • 1970-01-01
          • 2011-05-06
          • 2010-11-20
          • 2017-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多