封装,抽象和多态是必需的继承吗?

时间:2016-04-11 15:01:11

标签: oop inheritance polymorphism encapsulation abstraction

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

没有继承就可以进行封装吗?

没有继承就可以抽象吗?

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

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

由于

6 个答案:

答案 0 :(得分:7)

  • 是否可以在没有继承的情况下进行封装?

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

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

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

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

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

答案 1 :(得分:2)

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

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

抽象是指您删除对象的实现细节并创建抽象类或接口(以Java语言表达)。这将作为任何实现或继承类在详细实现中需要包含的内容的合同。抽象类将具有方法签名,但没有正文;继承类将实现这些实体。

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

请注意,它确实取决于要检查的多态性类型。正如另一个答案中所述,您可以使用方法/函数参数多态,并且如上所述,可以不使用继承。

答案 2 :(得分:1)

这三个问题的答案是肯定的,没有继承可以做到这一点,但真正的答案是"这取决于他们在"中实施的语言。 / p>

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

答案 3 :(得分:0)

嗯,我的理解:

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

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

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

  • 就无法做到

答案 4 :(得分:0)

  • Encapsulation 可能没有继承

    只需将私有属性添加到类中,然后使用setter和getters访问此属性。

  • Abstraction by self 可能没有继承: 你可以创建一个抽象类,它不需要任何继承。

  

如果问的问题是:可以不使用Abstract类   继承?

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

  • Polymorphism 在没有继承的情况下是不可能的:这是因为两种类型的对象之间的多态性必须具有共同点才能发挥作用。即使是java的Object类,这也很简单,从中派生所有类。

答案 5 :(得分:0)

我会说

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

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

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