私はUMLの前に、独立した継承と構成図を持ついくつかの方法論を扱っていました。UML では、これらを混在させる非常に強い理由がない限り、両方の図を分離しています。
同じことをすることをお勧めします。
例。
多重継承はサポートしていないが、単一継承はサポートしている C++ に似たプログラミング言語を使用しているとします。
オブジェクトとクラス指向のライブラリで作業していると仮定しましょう。クラス図、継承、およびその他の関連付けを使用して、そのライブラリで使用されるクラスをモデル化したいと考えています。
「ストリーム」クラスを使用してカスタム入出力ライブラリを作成するとします。
まず、ベースとなる「ストリーム」クラスを作成します。
............................................................
.+--------------------------------------------------------+.
.| <<abstract>> |.
.| StreamClass |.
.+--------------------------------------------------------+.
.| [+] bool canRead() <<virtual>> |.
.| [+] bool canWrite() <<virtual>> |.
.| [+] bool canSeek() <<virtual>> |.
.| [+] bool isOpen() <<virtual>> |.
.| [+] void read(byte[] Buffer, int MaxSize) <<virtual>> |.
.| [+] void write(byte[] Buffer, int MaxSize) <<virtual>> |.
.| [+] void open() <<virtual>> |.
.| [+] void close() <<virtual>> |.
.+--------------------------------------------------------+.
............................................................
ライブラリで「ラップ」したいファイルシステムライブラリが既にあるので、読み取り専用ストリームと書き込み専用ストリームクラスを作成したいと思います。
............................................................
.+--------------------------------------------------------+.
.| <<abstract>> |.
.| StreamClass |.
.+--------------------------------------------------------+.
.| [+] bool canRead() <<virtual>> |.
.| [+] bool canWrite() <<virtual>> |.
.| [+] bool canSeek() <<virtual>> |.
.| [+] bool isOpen() <<virtual>> |.
.| [+] void read(byte[] Buffer, int MaxSize) <<virtual>> |.
.| [+] void write(byte[] Buffer, int MaxSize) <<virtual>> |.
.| [+] void open() <<virtual>> |.
.| [+] void close() <<virtual>> |.
.+-+------------------------------------------------------+.
...^.........................................................
../.\........................................................
./...\........................................................
.--+--..........................................................
...|............................................................
...|...+---------------------------------------------------------+.
...|...| <<concrete>> |.
...|...| ReaderStreamClass |.
...|...+---------------------------------------------------------+.
...|...| [+] bool canRead() <<override>> |.
...+---+ [+] bool isOpen() <<override>> |.
...|...| [+] void read(byte[] Buffer, int MaxSize) <<override>> |.
...|...| [+] void open() <<override>> |.
...|...| [+] void close() <<override>> |.
...|...+---------------------------------------------------------+.
...|...............................................................
...|...+---------------------------------------------------------+.
...|...| <<concrete>> |.
...|...| WriterStreamClass |.
...|...+---------------------------------------------------------+.
...|...| [+] bool canWrite() <<override>> |.
...+---+ [+] bool isOpen() <<override>> |.
.......| [+] void write(byte[] Buffer, int MaxSize) <<override>> |.
.......| [+] void open() <<override>> |.
.......| [+] void close() <<override>> |.
.......+---------------------------------------------------------+.
...................................................................
これまで、基本クラスと 2 つのサブクラスをモデル化しましたが、大したことはありません。
後で、読み取りと書き込みの両方を許可するクラスが必要ですが、同時にではありません。そのため、コンポジションを使用して、新しいクラスを作成することにしました。これは、ストリームの基本クラスの子孫ですが、複合リーダー & ライター クラス。おそらく非表示です。
私自身、またはこのクラスを使用しようとしている他のプログラマーは、内部に他のストリームがあることを知りませんし、気にもしません。
(1) 継承図:
............................................................
.+--------------------------------------------------------+.
.| <<abstract>> |.
.| StreamClass |.
.+--------------------------------------------------------+.
............................^...................
.........................../.\..................
........................../...\.................
..........................--+--.................
............................|...................
............................|...................
............................|................................
.+--------------------------+------------------------------+.
.| <<abstract>> |.
.| ReaderWriterStreamClass |.
.+---------------------------------------------------------+.
.| [#] ReaderStreamClass Reader() |.
.| [#] WriterStreamClass Writer() |.
.+---------------------------------------------------------+.
.| [+] bool canRead() <<override>> |.
.| [+] bool canWrite() <<override>> |.
.| [+] bool canSeek() <<override>> |.
.| [+] bool isOpen() <<override>> |.
.| [+] void read(byte[] Buffer, int MaxSize) <<override>> |.
.| [+] void write(byte[] Buffer, int MaxSize) <<override>> |.
.| [+] void open() <<override>> |.
.| [+] void close() <<override>> |.
.+---------------------------------------------------------+.
............................................................
(2) 構成図:
.............................................................
.........+-------------------------------------------------+.
.........| <<abstract>> |.
.........| ReaderWriterStreamClass |.
.........+-------------------------------------------------+.
..+------+ [#] WriterStreamClass Writer() |.
..|..+---+ [#] ReaderStreamClass Reader() |.
..|..|...+-------------------------------------------------+.
..|..|.......................................................
..|..|...+-------------------------------------------------+.
..|..+---+ <<concrete>> |.
..|......| ReaderStreamClass |.
..|......+-------------------------------------------------+.
..|..........................................................
..|......+-------------------------------------------------+.
..+------+ <<concrete>> |.
.........| WriterStreamClass |.
.........+-------------------------------------------------+.
.............................................................
乾杯。