0

次のようなコード例を書きました。

class BaseClass
{
    public virtual void Execute() {}
}

class ClassA: BaseClass
{
    public override void Execute()
    {
        // ClassA Execute implementation
    }
}

class ClassB: BaseClass
{
    private BaseClass _b;

    public ClassB(BaseClass b)
    {
        _b = b;
    }

    public override void Execute()
    {
        _b.Execute();
    }
}
...
ClassB b = new ClassB(new ClassA());

上記のコードの適切な UML ダイアグラムを描きたいと思います。

<|_______   =  inheritance = "is-a"
<________   =  association
<>_______   =  aggregation = "has-a"

ClassB は実際には ClassA を使用するため、図は次のようになります。

    ______|>BaseClass<|_______
   |                          |
ClassA<_____________________ClassB

しかし、ClassB コンストラクターからわかるように、「is-a」BaseClass であるすべてのオブジェクトを受け入れ、さらにそれへの参照を保持するため、すぐに図を次のようにする必要があります。

    ______|>BaseClass<|_______
   |             |            |
ClassA           |________<>ClassB

どちらがより適切であるか、または両方が適切でない理由と、正しい図はどのように見えるでしょうか?

それに関する考えや推論は大歓迎です。ありがとうございました

編集: ClassB は BaseClass から継承されますが、BaseClass 派生オブジェクトへの参照も保持し、オブジェクトを使用します。要するに、私の問題は次のとおりです。クラス図でそれをどのように描写するのですか?

4

2 に答える 2

0

2 番目の図が正しいです。最初のものは、2番目の可能な「インスタンス」にすぎません。

于 2012-06-28T14:55:40.897 に答える
0

私は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           |.
.........+-------------------------------------------------+.
.............................................................

乾杯。

于 2012-06-28T15:55:21.147 に答える