封装只是封装创造吗?

问题描述 投票:-1回答:1

最近我和一位非常有经验的程序员(8年以上的经验)谈过,他告诉我“将数据与在封装中使用它们的函数相结合”是一个错误的封装术语。他告诉我,封装允许我这样做,但不是封装本身。他告诉我,只要没有封装就不可能进行继承,封装必须只是一个封装创建(类或类似的东西)。但今天我接受了一位经验不足的程序员的采访,他非常确定维基百科上的所有经典定义都是对的,他告诉我甚至不要想通过面试。所以我试图谷歌所有关于封装的东西,关于没有封装的遗传是不可能的,但没有找到任何东西。但我无法相信有经验的程序员是错的,他不仅让我感到高兴,也让其他经验丰富的程序员感到高兴。也许正确的定义只是在无用和不重要的信息块中丢失的东西?

所以,请给我这两个问题的答案:

1)没有封装可以继承吗? (班级从班级继承)

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

oop encapsulation
1个回答
1
投票

好吧,我很抱歉,但我没有看到封装和继承之间的联系。

封装将您的内部实现隐藏在公开可见的API背后。 基本上,它是类型的实际实现与它暴露的内容之间的分离。 从广义上讲,人们甚至可以看到人体并看到封装: 例如:你呼吸空气,这是你的公共API,但是你的身体用这种空气做的内部隐藏在你的呼吸系统内 - 你的弓箭将氧气传递给你的血液并从中吸收二氧化碳返回 - 从而改变你呼吸的空气中气体的混合比例,但这一点对外界来说都不可见。

在OOP世界中,继承是能够获取特定对象,并从中获取更具体的对象,同时添加功能(有时通过覆盖来改变现有功能)。 例如:一个Dog是一种Mammal,是一种AnimalAnimal可能包含诸如Eat()之类的方法以及诸如WeightAge之类的属性。 一个Mammal可能会超越Eat()方法来实现哺乳(从它的母亲的乳房)作为婴儿,但取决于它的年龄吃固体食物。 一个Dog可能会引入另一种能力,如Bark。 所有这些都与上一段所描述的封装无关。

继承与称为多态的面向对象编程的另一个核心原则紧密相关 - 基本上,使用它的基类类型引用派生类的能力 - 也许你(或访调员)混淆了两者?

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

一种语言结构,便于将数据与对该数据进行操作的方法(或其他功能)捆绑在一起。

根据该定义,封装是创建封装的过程 - 独立的代码片段,其中包含数据和与之交互的方式 - 也就是类型,类等等,并且与继承有些相关 - 为了继承类型,首先需要定义类型。 但是,就我看来,这个定义还不足以定义封装。它可以是定义的一部分,但不是封装的独立定义。

© www.soinside.com 2019 - 2024. All rights reserved.