标记subsets和redefines可以说是UML2.5.1中最重要的一对标记。标记subsets相对要好理解一些,但是redefines的含义就没有那么直白。先看一下目前已知的subsets和redefines的效果:
假定图一中A1和B1的关联两端的标记都是subsets,那么这一对标记就意味着在向A1和B1的关联添加一个新链接时,也要将此链接添加到A和B之间的关联中;
假定图一中A1和B1的关联两端的标记都是redefines,那么这一对标记就意味着仅需要向A1和B1的关联添加新链接即可,A和B之间的关联则不能添加此链接。
如果上述第二点是正确的,则就会带来一个问题:
关联两端的标记都是redefines与关联两端没有subsets/redefines标记的效果完全一样。而这显然是不正确的。
图一、
经过一番思考,本人提出如下redefines的最新解释:
假定向A1和B1之间的关联加入一个联接A3和B3的关联实例(Link1):
A1和B1两端都是redefines标记:
Item1:A2和B2两端都是subsets标记:
如下伪代码的依据在于:
A1和B1的子类(例如A2和B2)之间的关联如果都有subsets标记,则表明A2和B2之间的链接也都存在于A1和B1之间,在不违反这一个约束的同时,每增加一个A1和B1之间的链接,就要在A2和B2之间的关联中增加相同链接,以体现A1和B1之间关联两端的redefines标记的对A1和B1子类所产生的效果。
伪代码:
A(1)和B(1)之间增加Link1;
i = 2;
Anchor1:
如果Link1两端的对象的类型与A(i)和B(i)这两端的类的类型相同:
如果A(i)和B(i)这两端都为subsets标记:
A(i)和B(i)之间增加Link1;
Goto Anchor2;
如果A(i)和B(i)这两端都为subsets标记:
A(i)和B(i)之间增加Link1;
i++;
Goto Anchor1;
如果A(i)和B(i)这两端都为redefines标记:
Goto Anchor2;
如果A(i)和B(i)这两端一个为subsets标记,一个为redefines标记:
Goto Anchor2;
Anchor2:
结束计算。
Item2:A2是subsets标记,B2是redefines标记:
不满足Item1的条件,因此一律仅向自身添加新的链接。
伪代码:
A1和B1之间增加Link1;
结束计算。
Item3:A2和B2两端都是redefines标记:
不满足Item1的条件,因此一律仅向自身添加新的链接。
伪代码:
A1和B1之间增加Link1;
结束计算。
A1和B1两端,A1是subsets标记,B1是redefines标记:
Item4、A2和B2两端都是subsets标记:
不满足Item1的条件,因此一律仅向自身添加新的链接。
伪代码:
A1和B1之间增加Link1;
结束计算。
Item5、A2是subsets标记,B2是redefines标记:
不满足Item1的条件,因此一律仅向自身添加新的链接。
伪代码:
A1和B1之间增加Link1;
结束计算。
Item6、A2是redefines标记,B2是subsets标记:
不满足Item1的条件,因此一律仅向自身添加新的链接。
伪代码:
A1和B1之间增加Link1;
结束计算。
Item7、A2和B2两端都是redefines标记:
不满足Item1的条件,因此一律仅向自身添加新的链接。
伪代码:
A1和B1之间增加Link1;
结束计算。
经过进一步的分析,我们可以有如下结论:
结论一:如果添加的链接两端的终点对象的类型与要加入的关联的两端的类型相同,则关联两端都是redefines标记的作用与关联两端没有任何subsets/redefines标记的作用完全相同,这里即是仅向A1和B1的关联中添加链接,而不会向A2和B2的关联中添加链接,因为终点对象没有对应的子类对象;
结论二:如果关联(A1和B1)两端的标记都是subsets,则计算的前进方向是父类方向;
结论三:如果希望A1和B1之间的关联向子类方向前进,则需要满足三个前提条件:
条件一、A1和B1所在关联两端的标记都是redefines;
条件二、A2和B2所在关联两端的标记都是subsets;
条件三、新增的链接两端的终点对象的类型是A1和B1类型的子类。
结论四:如果关联(A1和B1)两端的标记一个是subsets,一个是redefines,则计算保持在原地不动,即仅向A1和B1之间添加链接,而A和B以及A2和B2之间则不添加任何链接;
正如前面结论三所示,这个解释的最大问题在于应用其的门槛太高,因此导致在绝大多数情况下,其所产生的效果与关联两端没有subsets/redefines标记的效果完全相同。
因此我的问题是,我给出的这个解释是否正确?或者说,正确的解释是什么?