我认为将继承视为这三件事的组合是否正确?

时间:2013-05-04 01:11:57

标签: object inheritance multiple-inheritance

A继承B意味着

  1. A拥有B。
  2. A分享所有B接口。
  3. A股实施B接口。
  4. 抽象类是相似的(例如,在objective-c中的@protocol。

    实现B意味着 2. A共享所有B接口。

    至于A拥有B和A股的B实现,我认为这可以通过@protocol和类别的组合来“推动”。

    在任何情况下,所有继承都是正确的吗?

    1. 所有权
    2. 分享界面
    3. 分享实施。
    4. 如果我在其中任何一方出错,请有人纠正我。

      所有权

2 个答案:

答案 0 :(得分:1)

是的,这基本上是正确的。有些人可能会对“所有权”主张提出质疑。这可能表明B“有一个A而不是B”是一个“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关系。

答案 1 :(得分:1)

这里的“所有权”概念可能存在问题。我认为最简单的方法就是'A',当继承自'B'时,做'B'所做的一切,除了'A'决定做一些不同的事情。 'A'没有'B'的所有权,除了默认情况下它会充当'B',直到你告诉它做一些不同的事情。