0

A が B の手段を継承する

  1. AはBを所有しています。
  2. A はすべての B インターフェイスを共有します。
  3. A は B インターフェースの実装を共有します。

抽象クラスは似ています (たとえば、objective-c の @protocol.

A は B を実装し、2 を意味します。A はすべての B インターフェイスを共有します。

A が B を所有し、A が B の実装を共有していることに関しては、@protocol とカテゴリの組み合わせで「プッシュ」できるものだと思います。

いずれにせよ、それですべての継承ですよね?

  1. 所有
  2. 共有インターフェース
  3. 共有実装。

これらのいずれかで私が間違っている場合は、誰かが私を修正してください。

所有

4

2 に答える 2

1

はい、それは基本的に正しいです。「所有権」の主張について疑問を呈する人もいるかもしれません。これは、B が「A である」というよりも、B が「A を持っている」ことを示唆している可能性があります。is-a 関係は、B のメモリの一部に A オブジェクトが含まれていることを意味します。一般的なオブジェクト指向言語では、継承は has-a 関係ではなく is-a 関係を意味します。

これらの2つのスケッチを検討してください

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 関係のもう 1 つの重要な特性は、サブクラスへのポインターをスーパークラスへのポインターとして安全に扱うことができることです。これは通常、変換または抽出方法が採用されていない has-a 関係では機能しません。

于 2013-05-04T01:22:46.290 に答える
1

ここでの「所有権」の概念には問題があるかもしれません。最も簡単に言えば、「A」が「B」から継承するとき、「A」が何か違うことをすることを決定した場合を除いて、「B」が行うすべてのことを行うということです。「A」には「B」の所有権はありませんが、デフォルトでは、別のことをするように指示するまで「B」として機能します。

于 2013-05-04T01:26:16.410 に答える