Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 封装、抽象和多态性是否需要继承?_Oop_Inheritance_Polymorphism_Encapsulation_Abstraction - Fatal编程技术网

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

Oop 封装、抽象和多态性是否需要继承?,oop,inheritance,polymorphism,encapsulation,abstraction,Oop,Inheritance,Polymorphism,Encapsulation,Abstraction,今天我面试了一个软件工程职位。我从stackoverflow那里读了很多关于面试的东西。他们问我关于OOP的正常情况。但他们也问我这些: 没有继承就可以进行封装吗 没有继承,抽象是可能的吗 没有继承,多态性是可能的吗 根据我对OOP的了解,我已经回答了这些问题。我不知道这是对还是错。有谁能用一些相关的例子告诉我这些问题的正确答案吗 谢谢 没有继承就可以进行封装吗 是的,因为封装是通过访问方法对外部世界隐藏类属性的能力 没有继承,抽象是可能的吗 抽象可以指很多东西,但说到OOP: 不,抽象类

今天我面试了一个软件工程职位。我从stackoverflow那里读了很多关于面试的东西。他们问我关于OOP的正常情况。但他们也问我这些:

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

没有继承,抽象是可能的吗

没有继承,多态性是可能的吗

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

谢谢

  • 没有继承就可以进行封装吗
是的,因为封装是通过访问方法对外部世界隐藏类属性的能力

  • 没有继承,抽象是可能的吗
抽象可以指很多东西,但说到OOP: 不,抽象类不能直接使用,只能实例化继承的类

  • 没有继承,多态性是可能的吗

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

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

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

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

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


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

好吧,我的理解是:

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

  • 抽象是类(对象模板)的泛化,它不能 不能继承。它着重于常见的合同条款

  • 多态性意味着相同的行为但不同的行为。通常是 使用抽象/接口。没有面向对象编程,这是不可能做到的

      • 封装
        无需继承即可实现

        只需向类添加private属性,并使用setter和getter访问该属性

      • 抽象本身在没有继承的情况下是可能的
        : 您可以将类抽象化,它不需要任何继承

      如果问题是:抽象类是否可以在没有 继承权

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

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

      这三个问题的答案都是肯定的,不需要继承也可以做到,但真正的答案是“这取决于它们的实现语言”

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

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

      抽象-是的。C++中的“概念”就是这样的一个例子。在C++中,你可以编写一个例程,并说“只要参数类型定义了一个小于运算符”,这个代码就编译了。
      多态性-是的。一个简单的函数指针可以用来提供一个可插入的实现

      所以,在封装中。你是说你有一个类,其中有所有的方法,你想对外界隐藏它?正确的?那么你的访问方法在哪里?如果它在同一个班级?那么它们不是被隐藏了吗?我的意思是你想对外界隐藏类或实例的属性,所以你需要构建方法(setter、getter等)来避免直接访问它们。这就是封装,“etc”部分是必不可少的。有些人认为封装只是提供getter和setter,而没有意识到它实际上是将数据及其相关行为(即使用该数据的方法)捆绑在一起。没有OOP还是没有继承?没有继承,是的,甚至没有OOP。这完全取决于语言。例如,在Smalltalk中,您可以实现无继承的多态性,因为Smalltalk是一种lat