是否可以将任何 class 的实例或对象视为另一个 class 中的属性?

Can instances or objects of any class be treated as attributes in another class?

在阅读 Craig Larman 的书时(应用 UML 和模式;...) 我注意到他在 DiceGame class.

中添加了 Die class 的实例作为属性

.


可能吗?并且有许多相关的 Programming Questions 他们拒绝这样做。

是的,这是可能的。 OOP 提供了一种容器关系,这意味着具有一种关系,其中一个class 可以包含另一个class 的实例。

例如,可以有一把椅子class和一个tableclass和一个房间class。现在房间可以有椅子和 table,所以房间 class 将有椅子和 table 的实例。

不仅可能,而且是标准情况。事实上,许多编程语言在 类 和 int.

等基本数据类型之间没有太大区别

这些不是 Die 的实例,而只是 Die 类型的两个属性。图片不是很好地使用 UML(对 Larman 感到羞耻)。 DiceGameDie 之间的关联使用 2 重数。很可能他的意思是 die1die2。但那只是猜测。更好的表示法是

具有适当的关联端名称。

简短回答:是的...而且经常发生。

在 OO 中有一个巧妙的小技巧来判断 class 是否应该包含 属性 或其他类型的 class."Is-A" 和 "Has-A".

在这种情况下,您有一个 DiceGame class。你问问自己,"Is-A" DiceGame 是 Die,还是 DiceGame "Has-A" Die。如果答案是前者,则使用继承,否则将其设置为 属性(ies),如您发布的示例中所示。

如果您有另一个名为 "GamblingRoom" 的 class,有一个 属性 的 "GamblingRoom" class "could" 是可行的解决方案....当然取决于您需要做什么。

在与您的问题类似的问题中,这里有一个更好的解释。但可能比我在这里做的解释得更好;)

HAS-A, IS-A terminology in object oriented language

我会将问题更改为,"Can references to any class be treated as attributes in another class?" 从技术上讲,答案是 "yes",但您不应该在 UML 中以这种方式建模。您应该将简单值建模为属性(在 class' 矩形内),但将非简单引用建模为关联。简单值仅由它们的值(例如,数字 5)标识,而非简单引用指向具有标识的事物。在你的例子中,每个 Die 应该有一个不同于其当前面值的身份。因此,您不应该为 Die 类型的属性建模,您应该为关联末尾的 属性 建模。

在您发布的图表中,有三个 (!!) 个类型为Die 的属性。一个叫die1,一个叫die2,还有一个没有名字,重数是2。在编程语言中,这会给你 4 个位置来存储对你的骰子的引用,这显然是不正确的。

我的建模方式如下:

当您生成代码(或手动转录)时,dice 属性 成为 DiceGame 中的成员变量。该成员变量通常由您的编程语言中的集合类型化,但也可以建模为数组。该集合或数组允许您访问两个骰子。

请注意关联是单向的。那是因为 Die 可能不需要访问 Dice Game。 (但是,如果您需要每个 Die 在其自己的线程中成为活动对象 运行,您可能需要关联是双向的,以便每个 Die 可以在完成滚动时发送信号或其他东西。)