2012-06-27 26 views
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的构造函数中看到它接受任何对象,它“是一个” BaseClass的,另外持有对它的引用,所以也许我应该马上让图如下所示:

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

哪一个更合适也许他们为什么都是不恰当的,将正确的图是什么样子?

任何想法和推理都会受到欢迎。谢谢

编辑: 事情是ClassB继承自BaseClass,但它也持有对BaseClass派生对象的引用并使用该对象。所以总之我的问题是:如何在类图上描述它?

+0

@罗伯特哈维:感谢您花时间回答我的问题,但我不明白你为什么删除了你的帖子:) – wmartinez

回答

0

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

0

我曾经在U.M.L.之前使用过一些方法,它们有独立的继承&构图。我仍然把这两个图表分开,在U.M.L.里面,有一个非常强烈的理由来混合它们。

我建议也这样做。

例子。

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

让suppouse我对象&类面向图书馆的工作,&我想用类图,继承&其他协会在图书馆使用的类模型。

让suppouse我使用“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个subclassses,没什么大不了的。

后来,我需要一个类,允许两者读&写,但是,不能在同一时间, 所以,我决定使用组成,并创建一个新的类,从我流的基类及其后裔,但是,必须复合阅读器编写器类,可能是隐藏的。

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

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

干杯。

相关问题