封装只是胶囊的创造吗?
Is encapsulation just a capsula creation?
最近我和一位非常有经验的程序员(8 年以上的经验)交谈,他告诉我 "combining data with functions that work with them in a capsula" 是封装的错误术语。他告诉我那是封装允许我做的事情,而不是封装本身。他告诉我,如果没有封装就不可能继承,那么封装就必须只是一种封装创建(class 或类似的东西)。但是今天我接受了一位经验不足的程序员的面试,他非常确定维基百科上的所有 classic 定义都是正确的,他告诉我甚至不要想通过面试。所以我尝试 google 所有关于封装的东西,以及关于没有封装就不可能继承的东西,但没有找到任何东西。但我不敢相信那个有经验的程序员错了,他不仅说服了我,也说服了其他有经验的程序员。也许正确的定义只是在无用和不重要的信息块中丢失的东西?
那么,请回答我这两个问题:
1)不封装是否可以继承? (A class 继承自 class)
2) 如果不行,那可不可以考虑声明一个class封装?因为只有声明了一个class我们才能继承。
不好意思,我没看到封装和继承之间的联系。
封装 将您的内部实现隐藏在 public可见的 API.
后面
基本上,它是类型的实际实现与其公开的内容之间的分离。
广义上,看人也可以body,看封装:
例如:你正在吸入和呼出空气,那是你的 public API,但是你的 body 正在用这种空气做的事情的内部结构隐藏在你的呼吸系统内 - 你的弓步将氧气传递到您的血液并从中收集二氧化碳 return - 从而改变您呼吸的空气中气体的混合比,但外界可以看到其中的 none。
继承,在 OOP 世界中,是获取特定 object 并从中派生出更具体 object 的能力,而添加功能(有时通过覆盖改变现有功能)。
例如:A Dog
是一种 Mammal
是一种 Animal
.
Animal
可能包含 Eat()
等方法和 Weight
和 Age
.
等属性
Mammal
可能会覆盖 Eat()
方法来实现婴儿的哺乳(从母亲的乳房),但这取决于它吃固体食物的年龄。
Dog
可能会引入另一种功能,例如 Bark
.
所有这些都与上一段中描述的封装无关。
继承与 object 面向编程的另一个核心原则紧密相关,称为 多态性 - 基本上,能够引用派生的 class 使用它的基础class 类型 - 也许您(或面试官)混淆了两者?
但是,今天是我第一次看到封装的另一种定义(我已经使用 oop 语言工作了大约二十年):
A language construct that facilitates the bundling of data with the methods (or other functions) operating on that data.
在那之下
定义,封装是创建胶囊的过程 - stand-alone 保存数据的代码片段和与之交互的方式 - a.k.a 类型、classes 等,并且与继承有些相关- 为了继承一个类型,首先需要定义该类型。
但是,在我看来,这个定义不足以定义封装。它可以是定义的一部分,但不是封装的stand-alone定义。
最近我和一位非常有经验的程序员(8 年以上的经验)交谈,他告诉我 "combining data with functions that work with them in a capsula" 是封装的错误术语。他告诉我那是封装允许我做的事情,而不是封装本身。他告诉我,如果没有封装就不可能继承,那么封装就必须只是一种封装创建(class 或类似的东西)。但是今天我接受了一位经验不足的程序员的面试,他非常确定维基百科上的所有 classic 定义都是正确的,他告诉我甚至不要想通过面试。所以我尝试 google 所有关于封装的东西,以及关于没有封装就不可能继承的东西,但没有找到任何东西。但我不敢相信那个有经验的程序员错了,他不仅说服了我,也说服了其他有经验的程序员。也许正确的定义只是在无用和不重要的信息块中丢失的东西?
那么,请回答我这两个问题:
1)不封装是否可以继承? (A class 继承自 class)
2) 如果不行,那可不可以考虑声明一个class封装?因为只有声明了一个class我们才能继承。
不好意思,我没看到封装和继承之间的联系。
封装 将您的内部实现隐藏在 public可见的 API.
后面
基本上,它是类型的实际实现与其公开的内容之间的分离。
广义上,看人也可以body,看封装:
例如:你正在吸入和呼出空气,那是你的 public API,但是你的 body 正在用这种空气做的事情的内部结构隐藏在你的呼吸系统内 - 你的弓步将氧气传递到您的血液并从中收集二氧化碳 return - 从而改变您呼吸的空气中气体的混合比,但外界可以看到其中的 none。
继承,在 OOP 世界中,是获取特定 object 并从中派生出更具体 object 的能力,而添加功能(有时通过覆盖改变现有功能)。
例如:A Dog
是一种 Mammal
是一种 Animal
.
Animal
可能包含 Eat()
等方法和 Weight
和 Age
.
等属性
Mammal
可能会覆盖 Eat()
方法来实现婴儿的哺乳(从母亲的乳房),但这取决于它吃固体食物的年龄。
Dog
可能会引入另一种功能,例如 Bark
.
所有这些都与上一段中描述的封装无关。
继承与 object 面向编程的另一个核心原则紧密相关,称为 多态性 - 基本上,能够引用派生的 class 使用它的基础class 类型 - 也许您(或面试官)混淆了两者?
但是,今天是我第一次看到封装的另一种定义(我已经使用 oop 语言工作了大约二十年):
A language construct that facilitates the bundling of data with the methods (or other functions) operating on that data.
在那之下
定义,封装是创建胶囊的过程 - stand-alone 保存数据的代码片段和与之交互的方式 - a.k.a 类型、classes 等,并且与继承有些相关- 为了继承一个类型,首先需要定义该类型。
但是,在我看来,这个定义不足以定义封装。它可以是定义的一部分,但不是封装的stand-alone定义。