1

UML表記strongに関して、属性がオブジェクトの構成をweak指し、属性がオブジェクトの集約を指すのは正しいですか?

4

2 に答える 2

1

コンポジションとアグリゲーションの違いとは関係ないと思います。両方のケースで両方が使用されているためです。

リンクの例:

  • 1対1の場合:
    1. 車はstrongキャブレターを参照しています。
    2. キャブレターはweak車に言及しています。
  • 1 対多の場合:
    1. Pond はstrongダックの配列への参照を持っています。
    2. 配列はstrong、含まれている各 Duck への参照を保持します。
    3. アヒルはweak池に言及しています。

どちらの場合も、参照を持つ所有者と後方参照strongを持つ所有オブジェクトがあります。weak

つまり、strongweakは、構成または集約を表す UML 接続線の 2 つのエンドポイントです。

于 2013-01-26T23:01:20.413 に答える
1

興味深い質問です。

それらは似ているが異なると言えます。

Objective-C では、弱い参照の存在理由は通常、そうでなければ保持サイクルとなるものを手動で中断する方法として説明されます。これは、ARC が (少なくとも現在) そのようなサイクルの収集をサポートしていないため必要です。これは実際には集計の使用ではありません。

また、後者が存在する限り、あるオブジェクトが別のオブジェクトに通知を送信する通知などに使用されることもわかります。これは集約に近いと思われるかもしれませんが、実際には「ターゲットが存在する場合は何かを行う」であり、「私が死んでもターゲットを殺さない」ではありません。

もちろん、Obj-C で弱い参照を使用して集計を実装することもできますが、期待どおりの動作が得られない場合があります。

参照からの C++ の例を検討してください。

class Professor;

class Department
{
   ...
private:
   // Aggregation
   Professor* members[5];
   ...
};

Objective-C では次のようになります。

@interface Department

@property (weak) NSArray *members;
...

@end

C++ オブジェクトが破棄されると、配列も破棄されますが、配列の要素は破棄されません。ただし、Objective-C では、配列も破棄されません。NSArray常にそのメンバーへの強力な参照が維持されるため、存在し続けます。もちろん、Objective-C 用に弱いコレクションを設計することもできます。

于 2012-10-31T18:01:53.457 に答える