【问题标题】:Composition and Aggregation referencing the same class (UML / TypeScript)组合和聚合引用同一个类(UML / TypeScript)
【发布时间】:2018-06-27 05:43:26
【问题描述】:

Hero 是否有可能具有聚合和组合关系,是否有意义?

我的目标是为每个英雄保留一份能力列表,但是在创建一个英雄时,应该只能添加一个能力而不是多个能力。这就是为什么我只为一种力量创造了一个私人属性力量的原因。

我的问题是关于 UML 类图的有效性。这是表达我意图的正确方式吗?

power 是一个聚合的原因是它可能是另一个类使用相同的 power 实例(我已经实现了一些缓存,它总是返回相同的 power 实例,为简单起见,我没有展示那部分)。

powers 是一个组合的原因是它强烈依赖于英雄实例。如果英雄被摧毁,力量也应该被清除。

UML 的代码确实看起来像这样(TypeScript):

英雄.ts

import { Power } from './power';

export class Hero {
  powers: Power[] = [];

  constructor(private power?: Power) {
    if (power) {
      this.addPower(power);
    }
  }

  addPower(power: Power) {
    this.powers.push(power);
  }

}

power.ts

export class Power {
  constructor(private title: string) { }
}

【问题讨论】:

  • stackoverflow.com/questions/48268986/… 上查看我的答案,尽管目前那里的 OP 正在拖钓:-/
  • 你的力量列表是固定给所有英雄还是每个英雄都可以使用不同的力量?
  • 嗨,@1 所以你说我应该更好地使用多重关联而不是聚合和组合? @2 每个英雄都应该拥有不同的能力
  • 是的,在几乎所有情况下,多重性都是更好的选择。并且省去了很多麻烦。
  • 与其用答案编辑您的问题,不如将其发布为新的“对自己的答案”。那将是完美的。

标签: typescript uml


【解决方案1】:

首先:可以在两个类之间进行聚合和组合。如您所说,如果我们的part class 应该用whole class 删除,我们应该使用Composition,如果没有,我们可以使用Aggregation(或Association)。两个方向都有可能(正如你所拥有的,只有递归关系是不可能的)

根据你的解释:

我的目标是为每个英雄保留一份能力列表,但是何时 创建一个它应该只能添加一个 Power 而不是 多重权力。这就是我创建私人的原因 只为一种力量赋予力量。

没有HeroPower 之间进行聚合。那只是 它们之间的依赖关系。根据您的代码和解释,您没有在代码中保存 ONE power,仅用于在Hero 中将实例设置为POWERS。这意味着您的Hero 没有任何一个Power 作为part class


然而,他们之间的构图是绝对正确的。因为你说:

这在很大程度上取决于英雄实例。如果英雄被摧毁,权力 也应该清洗。

【讨论】:

  • 您好,感谢您的详细回答。我认为我有一个聚合,因为我在一个实例的初始化时节省了一个电源。如果 typescript 中的构造函数包含带有修饰符和类型的内容,则 typescript 将初始化该值。例如。编写构造函数(私有权力:权力)解决这个问题:export class Hero { powers: Power[] = [];权力:权力;构造函数(power?: Power) { if (power) { this.power = power; this.addPower(power); } } 还是你的意思?
  • 我认为,在初始化时生成的power 就像一个临时变量来处理您的代码。由于结构原因,我们使用聚合。
【解决方案2】:

解决方案基于 UML 中接受的答案:

在 TypeScript 中,最好不要实例化 Power 类型的属性,因为它没有其他用途。因此构造函数只是得到一个 Power 并将其添加到 powers 数组中。

英雄.ts

import { Power } from './power';

export class Hero {
  powers: Power[] = [];

  constructor(power?: Power) {
    if (power) {
      this.addPower(power);
    }
  }

  addPower(power: Power) {
    this.powers.push(power);
  }

}

【讨论】:

  • 我认为<<use>> 是多余的。该关联已经暗示您使用Power
猜你喜欢
  • 2011-05-03
  • 2013-01-10
  • 2015-03-10
  • 1970-01-01
  • 2021-12-16
  • 2017-04-18
  • 2014-02-08
  • 2013-05-14
  • 2014-09-18
相关资源
最近更新 更多