引用同一类的组合和聚合(UML/TypeScript)

引用同一类的组合和聚合(UML/TypeScript),typescript,uml,Typescript,Uml,英雄有聚集和合成的关系,这有可能吗?这有意义吗 我的目标是为每个英雄保留一个异能列表,但是当创建一个英雄时,应该只能添加一个异能而不是多个异能。这就是为什么我只为一个电源创建了一个私有属性电源 我的问题是关于UML类图的有效性。这是表达我意愿的正确方式吗 power是聚合的原因可能是另一个类使用了相同的power实例(我实现了一些缓存,它们总是返回power的相同实例,为简单起见,我没有显示这一部分) 《权力》之所以是一部作品,是因为它强烈地依赖于英雄的实例。如果英雄被摧毁,异能也应该被清除

英雄有聚集和合成的关系,这有可能吗?这有意义吗

我的目标是为每个英雄保留一个异能列表,但是当创建一个英雄时,应该只能添加一个异能而不是多个异能。这就是为什么我只为一个电源创建了一个私有属性电源

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

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

《权力》之所以是一部作品,是因为它强烈地依赖于英雄的实例。如果英雄被摧毁,异能也应该被清除

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

hero.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);
  }

}
import { Power } from './power';

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

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

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

}
power.ts

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

首先:可以在两个类之间进行聚合和组合。正如您所说的,如果我们的
部分类
应该与
整个类
一起删除,我们应该使用组合,如果不是,我们可以使用聚合(或关联)。可以在一个方向上同时使用这两种方法(正如您所做的那样,只有递归关系是不可能的)

根据你的解释:

我的目标是为每个英雄保留一份力量列表,但是 创建一个只能添加一个电源,而不是 多重力量。这就是为什么我创建了一个私有 仅为一个电源设置电源属性

Hero
Power
之间没有聚合。那只是 它们之间的依赖关系。根据您的代码和解释,您不会在代码中保存ONE power,而只用于在
Hero
中将实例设置为
POWERS
。这意味着您的
英雄
没有任何
电源
作为
零件类


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

这在很大程度上取决于英雄的实例。如果英雄被摧毁,力量就会消失 也应该清洗


解决方案基于UML中公认的答案:

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

hero.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);
  }

}
import { Power } from './power';

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

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

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

}

看到我的答案了吧,尽管OP现在有点拖拉:-/你的力量列表对所有英雄都是固定的,还是每个英雄都会有不同的力量集?嗨,@1,你是说我最好使用多重关联,而不是聚合和合成@2每个英雄都应该有一套不同的能力是的,多样性在几乎所有情况下都是更好的选择。这也省去了很多麻烦。与其用答案编辑你的问题,不如把它作为一个新的“自我答案”发布。那太好了。嗨,谢谢你详细的回答。我认为我有一个聚合,因为我在初始化一个实例时节省了一个功耗。如果typescript中的构造函数包含带有修饰符和类型的内容,typescript将初始化该值。例如,编写构造函数(private power:power)解析为:导出类Hero{powers:power[]=[];power:power;构造函数(power?:power){if(power){this.power=power;this.addPower(power);}或者你的意思是什么?我认为,初始化时生成的
类似于一个临时变量来处理代码。由于结构原因,我们使用聚合。我认为
只是多余的。这种关联已经暗示你使用