2016-04-11 48 views
7

今天我接受了软件工程职位的采访。我已经从面试的stackoverflow中读了很多东西。他们问我有关OOP的正常情况。但他们也问我这些:封装,抽象和多态是必需的继承吗?

封装可能没有继承?

抽象可能没有继承?

多态性可能没有继承?

根据我对OOP的了解,我已经回答了这些问题。我不知道这是对还是错。任何人都可以通过一些相关的例子告诉我这些问题的正确答案。

感谢

回答

3
  • 就是封装可能不继承?

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

  • 抽象可能没有继承?

那么,抽象可以参考很多东西,但谈到OOP: 没有,一个抽象类,不能直接使用的,你只能实例化继承的类。

  • 多态性可能没有继承?

是的,多态是构建一个单一的接口到几种类型的对象,例如,一个单一的函数调用,可以接收不同的类或数据类型作为参数。它们可以被遗传或不被遗传。

+0

因此,在封装。你是说你有一门课程,你有所有的方法,你想从世界以外的地方隐藏它?对?那么你的访问方法在哪里?如果它在同一班上?那么他们是不是隐藏? –

+0

我的意思是你想隐藏外部世界的类或实例的属性,所以你建立方法(setter,getters等)以避免直接访问它们。这是封装。 – manolonte

+0

“等”部分是必不可少的。有些人认为封装只是提供getter和setter,而没有意识到它实际上是将数据及其相关行为(即使用该数据的方法)捆绑在一起。 [http://www.javaworld.com/article/2075271/core-java/encapsulation-is-not-information-hiding.html](http://www.javaworld.com/article/2075271/core-java/ encapsulation-is-not-information-hiding.html) – Piovezan

2

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

然而,抽象和多态性与继承有直接关系。

抽象是当你拿走一个对象的实现细节并创建一个抽象类或接口(根据Java讲话)。这将作为任何实施或继承类需要包含在具体实施中的合同。抽象类将有方法签名,但不包含主体;继承类将实现这些实体。

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

请注意,它取决于正在检查哪种类型的多态性。正如另一个答案中所述,您可以拥有方法/函数参数多态性,并且如前所述,没有继承是可能的。

0

嗯,我的理解:

  • 封装只是一个想法,以避免直接修改的 实例的状态,它甚至可以完成,无需OOP。

  • 抽象是泛化类(对象模板),它不能 没有继承。它侧重于共同合同条款。

  • 多态性意味着相同的行为,但行为不同。通常它使用抽象/接口 。它不能没有OOP

+0

没有OOP或没有继承? –

+0

没有继承,是的,即使没有OOP。 –

0
  • Encapsulation可能做不继承

    简单的私人属性添加到一个类,并使用setter和getter方法来访问此属性。

  • Abstraction由它的自我是可能没有继承: 可以使抽象的类,它不需要任何的继承。

如果这个问题问的是:可以抽象类没有 继承使用?

然后不,它不能没有继承使用,因为它需要首先实例化,因此它需要继承。但抽象本身并不需要继承。

  • Polymorphism是没有继承不可能的:这是因为这两种类型的对象之间多态性必须有共同的东西为它工作。如果是java的话,这甚至可以简化为Object类,从中派生出所有的类。
+0

完全取决于语言。例如,在Smalltalk中,您可以在没有继承的情况下实现多态,因为Smalltalk是一种后期绑定语言,只要它们都实现相同的方法(包括签名),就可以将两个对象视为相同对象 –

+0

需要了解的内容。所以在指定语言之前,这个问题没有正确的答案? – Rana

1

对这三个问题的回答是肯定的,可以不用继承来完成,但真正的答案是“它取决于它们实现的语言”。

我的意思是,认为第一个C++编译器实际上将它的代码编译为标准C,而不是OOP语言。显然,代码必须被编译为不支持继承的语言。

0

我会说

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

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

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