当前位置: 首页 > 知识库问答 >
问题:

当A类与B类有聚合和组合关系时,如何绘制UML图?

郑乐池
2023-03-14

我有两个问题要问。所以我们假设有一个类a和B,它们的定义如下。

1.

class A {
    private B b;
    private B otherB;
    public A(B otherB)
    {
        this.otherB = otherB; 
    }
}
class B {
}

所以类A与变量b有组合关系,与变量其他B有聚合关系。我如何在UML图中画这个。

2.以下情况是否仍然是复合关系?

class A
{
    private B b;
    public B getMethod(){
        B newB = new B();
        newB.bValue = b.bValue;
        return newB;
    }  
}
class B
{
    private int bValue;
}

共有2个答案

秦胡媚
2023-03-14

>

  • 事实上,在类之间创建多个关联是合法的。建议在执行此操作时为每个关系分配一个角色。

    我想说是的,这仍然是一种复合关系(尽管其他人可能不同意)。为了说明我的情况,我们看一下简单的IBM定义,其中显示了由Schedule组成的Student(可能还有其他内容)。很容易想象,也会有一个由时间表组成的老师,一个老师可能想要得到一个学生的时间表,反之亦然。另一个类获取Schedule是否会使组合关系失效?我认为不是;或者至少,IBM的定义似乎没有那么狭窄以至于排除了这种可能性。

  • 浦墨竹
    2023-03-14

    从实现的角度来看(这也适用于前面的问题),你需要理解组合关联意味着什么。

    基本上,如果我们有实例规范a1和a2(作为类A的实例),那么只有其中一个可以通过复合关联的角色(关联端)“composesB”组成实例b1(作为类B的实例)。

    同样地,如果a1通过复合关联的“comicesB”角色组成b1,那么每次a1被“破坏”时,b1也应该被“破坏”。相反,如果a1对象通过聚合关联的“聚集B”角色聚合b1,则不会发生这种情况。

    正如您所想象的,从实现的角度来看,为了支持两个类之间的复合关联,您需要的不仅仅是一个类中的一个字段和一个简单的方法

    更新:包含一个示例。

    例如,EMF是EMOF规范的一个实现(它不是UML),其中包含引用的概念(类似于复合关联的概念)可以描述如下。在我们的特殊情况下:

    离开技术细节,当您将B实例设置为a实例对象的一部分(包含、组成)时,您可能会理解这一点。首先,您必须检查前者是否可能通过相同的包含引用包含在不同的a实例中,如果是,则需要从旧的a实例删除这样的B实例。

     类似资料:
    • 我在UML中遇到了和关系的一些问题,我确实理解整体/部分关系,所以如果一个类不能没有它的整体而存在,那么它就成为一个强的组合关系,如果它仍然可以没有它的整体而存在,那么它就成为一个弱的聚合关系。 然而,当处理真正的软件需求时,有时会变得更加棘手。我有一个下面的类图,包括所有必要的属性、操作和特性,它们都正确地显示在UML标准中,但是我不确定我的关系: 1 接口和 6 类 有人可以确认我的关系是否正

    • 好吧,所以我有点困惑,当我试图在UML图中显示关系时,什么时候应该向类添加属性,什么时候应该向类绘制关联。 例如,假设我有一个包含10个状态对象的DFA类,每个对象都有一组不同的路径指向DFA中的不同状态。我应该绘制从DFA到State类的组合线,还是只在DFA类的attribute部分输入所有10个状态? 基本上,我试图弄清楚当一个类包含(或由)一个或多个类B时,我应该在它们之间画一条线(聚合、

    • 因此,我对UML图中的关联、聚合和组合有一些疑问。以下是一些场景: > 产品评审对产品评审的评级组成。这意味着对于每一个产品评审等级必须有产品评审?如果产品评审不存在,评审评级就没有意义。 客户NRIC协助推车和订货。我们不能使用聚合,因为如果客户不存在,购物车和订单也不存在。 有人能帮我检查一下我的关系是否正确吗?因为我对聚合和关联有点困惑,所以用关联来链接所有的表是好的吗。我不知道什么时候该用

    • 我对我要在类图中使用哪些关系有些怀疑。我知道我可以使用一般关联(使用关联行)或更多特定的关联,如聚合或组合。我已经知道聚合和组合的定义,但我的问题是: 何时需要使用一般关联,何时需要使用更具体的关联 有什么规则吗

    • 假设我们有两个名为Point和Line的类。Line类有两个构造函数。这是Point类的代码。 这是Line类的代码。 如您所见,Line类有两个构造函数。第一个构造函数是组合的例子,而第二个构造函数是集合的例子。现在,关于这个案子我们能说些什么?一个类可以同时有聚合和合成吗?谢谢你的回答。

    • 我开始研究 OOAD,我很难找到一个 代码示例来说明如何以编程方式实现、和。(到处都有几篇文章,但它们与 C# 或 Java 有关)。我确实找到了一两个例子,但它们都与我的导师的指示相冲突,我很困惑。 我的理解是,在: < li >关联:Foo有一个指向Bar对象的指针作为数据成员 < li >聚合:Foo有一个指向Bar对象的指针,Bar的数据被深度复制到该指针中。 < li >组成:Foo有一