阅读Craig Larman的书(应用UML和模式; ...) 我注意到他在DiceGame类中添加了Die类的实例作为属性。
有可能吗?并且有很多相关的Programming Questions他们否定这样做。
答案 0 :(得分:3)
这些不是Die
的实例,只是Die
类型的两个属性。图片不是UML的很好用(对Larman的耻辱)。 DiceGame
和Die
之间的关联使用2个多重性。而且他很可能意味着die1
和die2
。但那可能是猜测。更好的表示法是
使用适当的关联结束名称。
答案 1 :(得分:1)
简短回答:是的......经常发生这种情况。
在OO中有一个巧妙的小技巧来弄清楚一个类是否应该包含其他类型的属性。“Is-A”和“Has-A”。
在这种情况下,您有一个DiceGame类。你问自己,“Is-A”DiceGame是死,还是DiceGame“Has-A”死。如果答案是前者,则使用继承,否则将其设置为属性(ies),如您发布的示例中所示。
如果你有另一个名为“GamblingRoom”的课程,那么拥有DiceGame“GamblingRoom”课程的属性“可能”是一个可行的解决方案......取决于你当然需要做什么。
这是一个类似问题的更好的解释,但你可能更好地解释了我在这里所做的事情;)
答案 2 :(得分:1)
我会将问题改为," 引用可以将任何类视为另一个类中的属性吗?"答案在技术上是"是",但你不应该用UML那样建模。您应该将简单值建模为属性(在类'矩形内),但将非简单引用建模为关联。简单值仅由它们的值(例如,数字5)标识,而非简单引用指向具有标识的事物。在您的情况下,每个Die
应该具有除当前面值之外的身份。因此,您不应对Die
类型的属性建模,您应该在关联结束时对属性建模。
在您发布的图表中,有三个类型为Die
的(!!)属性。一个称为die1
,一个称为die2
,另一个未命名,具有多个2
。在编程语言中,这将为您提供四个位置来存储对骰子的引用,这显然是不正确的。
我建模的方式如下:
当您生成代码(或手动转录)时,dice
属性将成为DiceGame
中的成员变量。该成员变量通常由编程语言中的集合键入,但也可以将其建模为数组。该集合或数组允许您访问两个骰子。
请注意,关联是单向的。这是因为Die
可能无需访问Dice Game
。 (但是,如果您需要每个Die
成为在其自己的线程中运行的活动对象,则可能需要将关联设置为双向,以便每个Die
可以在完成滚动时发送信号什么的。)
答案 3 :(得分:0)
是的,这是可能的。 OOP提供容器关系,这意味着具有关系,其中一个类可以包含另一个类的实例。
例如,可以有一个椅子类,一个表类和一个房间类。现在房间可以有椅子和桌子,所以房间类可以有椅子和桌子。
答案 4 :(得分:0)
这不仅是可能的,而且是标准案例。事实上,许多编程语言在类和基本数据类型(如int
。