以上显示了一个类图。在A类中有doThis(obj:Class B),它接受ClassB的对象并最终调用obj.operation1()。
仅因为这个原因,A类和B类之间是否存在联系?或者没有必要链接它们,A类可以使用B类对象调用operation1()?
答案 0 :(得分:1)
如果A保留对B的引用,则应链接A类和B类。但是,如果A仅在执行“doThis”期间知道B,则不需要该链接。
答案 1 :(得分:1)
类图中的链接可以是以下之一:
以上所有链接都反映在代码中。我将在java中给出一些例子:
<强>协会强> 如果关联是单向的(链接有一个指向B的箭头),那么A类的字段为B类。
public class A {
B b;
}
如果关联是双向的(链接中没有箭头),那么B类也有一个A类字段。
public class B {
A a;
}
<强>概括强>
在这种情况下,A继承B。
public class A extends B {
//class implementation
实现
在这种情况下,B
必须是一个接口,A
是实现它的类。
public class A implements B {
//class implementation
<强>依赖强>
在这种情况下,A级依赖于B级。这是什么意思?这意味着类B以某种方式存在于类A的代码中。因此,如果类A和B在不同的包中,则A的类文件具有类B的import语句
import somepackage.B;
public class A {
void someMethod() {
B b = ...
}
}
具体图怎么样? 特定图表没有指定关联的可导航性,即没有声明哪个类保持对另一个的引用。通常,当没有明确的导航性规范时,暗示了双向关联。类之间具有双向关联的图表转换为:
public class A {
B b;
public void doSomething(B obj) {
obj.operation1();
}
}
public class B {
A a;
public void operation1() {
//some code in here...
}
}
如果类A没有类B的字段,但它只使用B作为doSomething(b)
方法中的参数,那么就没有关联,而是依赖关系。所以你应该用关联链接替换关联链接,你的图表将是:
是否应该从图中省略依赖关系?
您不需要在UML图中显示两个类之间的每个链接。 UML是一种通信方式,因此您可以省略任何不会对正在传递的消息增加价值的内容。在具有更多类的更复杂的场景中,很可能您不希望呈现类的所有依赖关系或关联,而只想呈现您认为重要的类。否则,该图表将充满链接并变得不可读。
因此,如果您认为A类与B类的依赖关系并不重要,您可以在图表中省略它(因为它也出现在doSomething(b)
方法的签名中。通常你不会我想在图中呈现每个编译依赖项,但更重要的是。
另一方面,如果此关系是您要传达的消息的一部分,那么您应该将其包含在图表中。在这种情况下,我发现使用有意义的构造型装饰依赖链接非常有用,它描述了依赖的类型。 <<invokes_operation1>>
之类的内容更具描述性,特别是operation1()
是B类功能的重要组成部分。