UML表記strong
に関して、属性がオブジェクトの構成をweak
指し、属性がオブジェクトの集約を指すのは正しいですか?
2 に答える
コンポジションとアグリゲーションの違いとは関係ないと思います。両方のケースで両方が使用されているためです。
リンクの例:
- 1対1の場合:
- 車は
strong
キャブレターを参照しています。 - キャブレターは
weak
車に言及しています。
- 車は
- 1 対多の場合:
- Pond は
strong
ダックの配列への参照を持っています。 - 配列は
strong
、含まれている各 Duck への参照を保持します。 - アヒルは
weak
池に言及しています。
- Pond は
どちらの場合も、参照を持つ所有者と後方参照strong
を持つ所有オブジェクトがあります。weak
つまり、strong
とweak
は、構成または集約を表す UML 接続線の 2 つのエンドポイントです。
興味深い質問です。
それらは似ているが異なると言えます。
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 用に弱いコレクションを設計することもできます。