我写了一个这样的示例代码:
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派生对象的引用并使用该对象。所以总之我的问题是:如何在类图上描绘它?
答案 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 |.
.........+-------------------------------------------------+.
.............................................................
干杯。