哪个更适合代表代码中的关系?

时间:2012-06-27 18:38:40

标签: uml associations aggregation

我写了一个这样的示例代码:

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派生对象的引用并使用该对象。所以总之我的问题是:如何在类图上描绘它?

2 个答案:

答案 0 :(得分:0)

第二张图是正确的。第一个是第二个可能的“实例”。

答案 1 :(得分:0)

我曾经在U.M.L.之前使用过某种方法,它具有独立的继承性和优势。组成图。我仍然将这两个图分开,在U.M.L.中,至少有一个非常强烈的理由将它们混合在一起。

我建议也这样做。

实施例

让我们假设我正在使用不支持多继承的C ++类似编程语言,但支持单继承。

让我说我在Object&amp;面向课程的图书馆,&amp;我想模拟该库中使用的类,使用Class Diagrams,Inheritance&amp;其他协会。

让我假设我使用“Stream”类创建自定义输入/输出库。

首先,我创建一个基础“流”类:

............................................................
.+--------------------------------------------------------+.
.|                    <<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个子类,没什么大不了的。

后来,我需要一个允许阅读和阅读的课程。写,但不是在同一时间, 所以,我决定使用组合,并创建一个新的类,它的后代来自我的基类,但是,必须复合阅读器&amp;作家课,也许是隐藏的。

我自己或其他将要使用此课程的程序员不知道或不关心, 在内部有其他流。

(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           |.
.........+-------------------------------------------------+.
.............................................................

干杯。