我曾经在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 |.
.........+-------------------------------------------------+.
.............................................................
干杯。
@罗伯特哈维:感谢您花时间回答我的问题,但我不明白你为什么删除了你的帖子:) – wmartinez