封装、抽象和多态是否需要继承?

Is inheritance necessary for encapsulation, abstraction and polymorphism?

今天我面试了软件工程职位。为了这次面试,我从 Whosebug 上读了很多东西。他们问我关于 OOP 的常见问题。但他们也问了我这些:

没有继承是否可以封装?

没有继承是否可以抽象?

多态可以不用继承吗?

我已经根据我对OOP的了解回答了这些问题。我不知道这是对还是错。哪位大侠能举个例子告诉我正确答案吗

谢谢

  • 没有继承是否可以封装?

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

  • 没有继承是否可以抽象?

嗯,抽象可以指代很多东西,但是说到 OOP: 不行,抽象的class不能直接使用,只能实例化继承的classes.

  • 多态可以不用继承吗?

是的,多态性是针对多种类型的对象构建单个接口,例如,可以接收不同 classes 或数据类型作为参数的单个函数调用。可以遗传也可以不遗传

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

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

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

多态性是以不同形式实现抽象事物的能力。例如,如果你有一个名为 Animal 的抽象 class,它包含一个 speak() 方法,你可以创建一个 Dog class 继承自 Animal 并实现 speak() 以打印 "woof",而 Cat() class 将执行 speak() 以打印 "meow"。

请注意,它确实取决于所检查的多态性类型。如另一个答案所述,您可以具有 method/function 参数多态性,并且如前所述,没有继承也是可能的。

嗯,我的理解:

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

  • 抽象是类(对象模板)的概括,它不能 在没有继承的情况下完成。它侧重于通用合同条款。

  • 多态意味着动作相同但行为不同。通常它 与 Abstraction/Interfaces 一起工作。没有 OOP

  • 是做不到的
  • Encapsulation 可能没有继承:

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

  • Abstraction 本身 可以不继承 : 你可以做一个class抽象,它不需要任何继承。

If the question asked was : can an Abstract class be used without inheritance?

那不行,没有继承就不能用,因为需要先实例化,所以需要继承。但是抽象本身不需要继承。

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

三个问题的答案都是肯定的,没有继承也可以,但真正的答案是"It depends on the language they're implemented in"。

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

我会说

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

抽象 - 是的。 "Concepts" 在 c++ 中就是一个例子。在 C++ 中,您可以编写例程并说 "this code compiles as long as the argument type defines a less than operator".

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