2

以下の疑似コードが示すように、 2 つのクラスがあると仮定BAますBaA

class A {}

class B extends A { 
     A a; 
}

BUML 用語では、 classと classの間に 2 つの関係がありAます。B'is-a' はAonの種類であり、 B'has-a' は のプロパティですA。これらの関係を 1 つのクラス図で同時に表すことはできますか?

ここに画像の説明を入力

これをググると、すべての結果で 2 つのクラス間に 1 つの関係しか存在しないことが一般的です。ですから、このような図を描いてよいかどうかはわかりません。そうでない場合は、このようなクラス間の関係を UML でどのように表現するか。

4

5 に答える 5

3

もちろん可能です。例: 人間は一種の動物であり、ペットとして動物を飼うことができます。(人間をペットとして禁止する規則が必要かもしれませんが. :-) )

ただし、絶対にうまくいかないことの 1 つは、最小カーディナリティを 1 にすることです。これは、すべてのペットにもペットが必要であることを意味します。

テキスト、疑似コード、および UML が一致しないことに注意してください。あなたの UML ダイアグラムは、合成を使用しています。つまり、私の例のペットが死ぬと、飼い主も死ななければなりません! これを修正するには、ホワイト ダイヤモンドを使用します。

于 2013-08-10T05:52:10.647 に答える
1

はい、まれではありますが可能です。クラスは抽象エンティティであり、いくつかの異なるインスタンスを持つことができるため、そのような構造を持つことができます。

たとえば、円を含む赤い円:

赤い円には円が含まれています

class Circle {}

class RedCircle extends Circle { 
     Circle a; 
     //...
     //more stuff for the red property
}
于 2013-08-10T06:37:44.693 に答える
1

これの古典的な例は次のとおりです。

A=Piece B=CompositePiece (複合かどうかに関係なく、他のピースでできている)

于 2013-08-10T05:53:28.217 に答える
1

このアプローチの最も一般的なアプリケーションの 1 つは、複合デザイン パターンとして知られており、ツリーのようなデータ構造を表すためによく使用されます。

このパターンは、ツリー (階層) を表現するだけでなく、(適切なoperation()実装を介して) 効果的かつ均一に処理する可能性を提供します。

複合パターン

編集

この回答を書いているとき、メソッドの単純なオーバーライドが不可能または適切でない場合に単純に拡張するのではなく、継承と包含によってコンポーネントの機能を拡張するために使用される、広く使用されている他のデコレーターデザインパターンを完全に忘れていました。

デコレータ パターン

于 2013-08-10T13:37:53.013 に答える
-1

あなたは絶対にできます。

これを使用できる 1 つの例は、なんらかの理由で各ノードを異なるサブクラスにしたいある種のカスタム LinkedList です。この場合、ノードはノード タイプになりますが、次/前のノードへの参照も含まれます。

これを UML で表現する方法については、同じ 2 つのボックスをリンクする 2 つの線を作成できない理由がわかりません。結局のところ、2 つの別個の関係があります。

于 2013-08-10T04:25:12.960 に答える