A继承B意味着
- A拥有B。
- A共享所有B接口。
- A 共享 B 接口的实现。
抽象类是相似的(例如,objective-c 中的@protocol。
A实现B意味着2。A共享所有B接口。
至于 A 拥有 B 并且 A 共享 B 的实现,我认为这是可以通过 @protocol 和类别的组合“推动”的东西。
无论如何,这就是所有继承都是对的吗?
- 所有权
- 分享界面
- 共享实施。
如果我在其中任何一个方面错了,请任何人纠正我。
所有权
A继承B意味着
抽象类是相似的(例如,objective-c 中的@protocol。
A实现B意味着2。A共享所有B接口。
至于 A 拥有 B 并且 A 共享 B 的实现,我认为这是可以通过 @protocol 和类别的组合“推动”的东西。
无论如何,这就是所有继承都是对的吗?
如果我在其中任何一个方面错了,请任何人纠正我。
所有权
是的,这基本上是正确的。有些人可能会质疑“所有权”的说法。这可能表明 B“拥有”A 而不是 B“是”A。在面向对象的术语中,has-a 关系通常意味着 B 的一个字段是指向 A 对象的指针。is-a 关系意味着 B 的部分内存包含一个 A 对象。对于常见的面向对象语言,继承意味着一种 is-a 关系,而不是 has-a 关系。
考虑这两个草图
B has-a A
=========
+--------------+ +----------------+
B* b -> | A* a_part | -> | float a_field1 |
| int b_field1 | | float a_field2 |
| int b_field2 | +----------------+
+--------------+
B is-a A
========
+----------------+
B* b -> | float a_field1 | <- A* a_part_of_b
| float a_field2 |
| int b_field1 |
| int b_field2 |
+----------------+
is-a 关系的另一个重要属性是指向子类的指针可以安全地视为指向超类的指针。这通常不适用于没有使用转换或提取方法的 has-a 关系。
这里的“所有权”概念可能存在问题。我认为最简单的说法是,当“A”从“B”继承时,“A”会做“B”所做的一切,除非“A”决定做一些不同的事情。“A”没有“B”的所有权,除了默认情况下它充当“B”,直到你告诉它做一些不同的事情。