UML のコンテキストを除いて、A が B を拡張する場合、B は A のサブセットです。
しかし、UML では逆です。たとえば、A が B を拡張すると、A は B のサブセットになります。
なぜそれはとても奇妙ですか?
依存関係は<<extend>>
ユースケースにのみ使用されます。これは、特定の状況下で1つのユースケースが他のユースケースを拡張することを意味します。以下では:
クライアントはアカウントの詳細を表示します。特定の状況下では、クライアントは「アカウントの詳細の表示」の一部として「未処理の注文の表示」を行う場合もあります。クライアントが「アカウントの詳細の表示」の一部として「履歴の表示」を行う可能性もあります。
これは一般化/専門化とは何の関係もありません。
<<extend>>
ユースケース図では混乱を招きます。混乱の最小の部分は、ユースケース図がユースケースではないということです!
ユースケースはドキュメントであり、図ではありません。たとえば、上の図は、次のユースケーステキストから作成された可能性があります。
拡張機能:
1a。クライアントが「未決済注文」リンクをクリックした場合、クライアント
は未決済注文を表示します
1b。クライアントが[履歴の表示]リンクをクリックした場合クライアント
は履歴を 表示します
より詳細なモデルでは、これらの「拡張ポイント」は、図の「アカウントの詳細の表示」ユースケース要素にリストされます。しかし、私の意見では、これは図をひどく乱雑にします。
私は最初、MartinFowlerの「UMLDistilled」を読んでUMLを本当に学びました。この回答を投稿する前にその本をチェックしたところ、ファウラーが無視することを提案していることがわかりました<<extend>>
。
ユースケースの観点から書くと(これはあなたが意図した文脈だと思います-そうでない場合は訂正してください)、お気に入りのファーストフードレストランで食事を注文することを考えないでください。
基本はお食事のご注文ですが、割引クーポンをご提示いただくと延長可能です。このユースケースを通過するたびに、食事が提供されますが、特別な状況下でのみ、通常よりも支払う金額が少なくなります (または追加のサンドイッチが提供されます)。
ここで非常に良い例を見つけました: http://www.agilemodeling.com/essays/useCaseReuse.htm。ご覧のとおり、留学生の登録には追加のセキュリティ チェックが含まれており、一部の登録にのみ適用されます。それがもっと役立つことを願っています。
UMLは、「拡張/拡張する」という用語を使用しません。代わりに、「一般化/一般化」という用語を使用します。人々はしばしばそれを「継承/継承する」と呼びます。
BがAの一般化である場合(つまり、AがBから継承する場合)、AはBのサブセットです。これは「is-a」関係から明らかになるはずです。すべてのAがBである場合、Aは明らかにB.あなたの用語では、AがBを拡張する場合、AはBのサブセットです。
タイプは述語です。すべてのオブジェクトについて、それが述語に属しているかどうかを判別できます。述語を拡張するということは、それをより制限的にすることを意味します。