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_Encapsulation - Fatal编程技术网

Oop 封装仅仅是一种胶囊创造吗?

Oop 封装仅仅是一种胶囊创造吗?,oop,encapsulation,Oop,Encapsulation,最近,我与一位经验丰富的程序员(8年以上的经验)交谈,他告诉我,“将数据与在胶囊中使用的函数相结合”是一个错误的封装术语。他告诉我这是封装允许我做的,但不是封装本身。他告诉我,如果没有封装就不可能继承,那么封装必须只是一个胶囊创建(类或类似的东西)。但今天我接受了一位经验不太丰富的程序员的采访,他非常肯定维基百科上所有的经典定义都是正确的,他告诉我不要想通过采访。所以我试着在谷歌上搜索所有关于封装的东西,以及没有封装就不可能实现继承的东西,但没有找到任何东西。但我不能相信有经验的程序员是错的,他

最近,我与一位经验丰富的程序员(8年以上的经验)交谈,他告诉我,“将数据与在胶囊中使用的函数相结合”是一个错误的封装术语。他告诉我这是封装允许我做的,但不是封装本身。他告诉我,如果没有封装就不可能继承,那么封装必须只是一个胶囊创建(类或类似的东西)。但今天我接受了一位经验不太丰富的程序员的采访,他非常肯定维基百科上所有的经典定义都是正确的,他告诉我不要想通过采访。所以我试着在谷歌上搜索所有关于封装的东西,以及没有封装就不可能实现继承的东西,但没有找到任何东西。但我不能相信有经验的程序员是错的,他不仅让我感到方便,也让其他有经验的程序员感到方便。也许正确的定义只是在无用和不重要的信息中丢失的东西

请回答这两个问题:

1) 没有封装就可以实现继承吗?(类从类继承而来)


2)如果不是,那么我们可以考虑声明类封装吗?因为只有在声明一个类之后我们才能继承。

很抱歉,我看不到封装和继承之间的联系

封装将您的内部实现隐藏在公开可见的API后面。
基本上,它是类型的实际实现和它公开的内容之间的分离。
从广义上讲,人们甚至可以通过观察人体看到封装:
例如:你在呼入呼出空气,这是你的公共API,但你身体内部对这些空气的处理隐藏在你的呼吸系统中-你的弓箭步将氧气传递到血液中,并从血液中收集二氧化碳作为回报-从而改变你呼吸的空气中气体的混合比例,但这些都不为外界所知

继承在面向对象的世界中,是一种获取特定对象并从中派生出更特定对象的能力,同时添加功能(有时通过重写来改变现有功能)。
例如:狗是一种哺乳动物,它是一种动物
动物
可能包含
Eat()
等方法和
体重
年龄
等属性
哺乳动物
可能会覆盖
Eat()
方法,以在婴儿时期实施哺乳(从其母亲的乳房),但这取决于它的年龄食用固体食物。
可能会引入另一种功能,如
吠叫

所有这些都与上一段描述的封装无关

继承与面向对象编程的另一个核心原则密切相关,称为多态性(polymorphics)——基本上,就是使用派生类的基类类型引用派生类的能力——也许你(或采访者)混淆了这两个原则

然而,今天是我第一次看到封装的另一个定义(我已经使用oop语言工作了大约二十年):

一种便于将数据与操作该数据的方法(或其他函数)捆绑在一起的语言结构

在那下面 定义,封装是创建胶囊的过程,胶囊是保存数据和与数据交互的方式的独立代码段,也称为类型、类等,与继承有一定关系。要继承类型,首先需要定义该类型。

然而,在我看来,这个定义不足以定义封装。它可以是定义的一部分,但不是封装的独立定义。

英文维基百科文章提到了两个相关的定义。在没有继承的情况下,将内部变量隐藏到外部世界的封装是完全可能的。你可能还想读一读,我知道封装没有继承是可能的。如果OOP上下文中的继承是通过扩展这个类向现有类添加方法的可能性,那么根本不涉及封装。所以,是的,这是可能的。当然是,但它很快就会以不可维护的代码结束。但是封装并不是创建一个类?我们讨论的是封装,看起来我只是犯了一个可怕的错误。谢谢你的回答。我在回答中又加了一段。