【问题标题】:Can instances or objects of any class be treated as attributes in another class?任何类的实例或对象都可以被视为另一个类的属性吗?
【发布时间】:2016-05-30 18:14:46
【问题描述】:

在阅读 Craig Larman 的书时(应用 UML 和模式;...) 我注意到他在 DiceGame 类中添加了 Die 类的实例作为属性。


.


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

【问题讨论】:

  • 我不知道为什么这被提名为不清楚。 OP显然对实例有一些误解。但是,嘿,我们是来澄清这类问题的。
  • 我也觉得比较清楚。我没有投票权,否则我会帮忙推翻这一点。

标签: oop uml class-diagram object-oriented-analysis


【解决方案1】:

这些不是Die 的实例,而只是Die 类型的两个属性。图不是很好用的UML(耻辱Larman)。 DiceGameDie 之间的关联使用 2 多重性。他很可能是指die1die2。但这只是猜测。更好的符号是

具有适当的关联端名称。

【讨论】:

  • 这就是我要回答的方式,但你打败了我。不过,我可能会让关联单向,除非骰子出于某种原因是异步的并将信号发送回游戏。
  • @JimL。我应该让你多一点时间 :-) 老实说我有很多空闲时间,所以我在快车道上。然而,你的答案往往比我的表达得更透彻。不幸的是,他们关闭了这个。我一点也不明白。我会投票支持重新开放,这样你就可以回答,我会收回我的。
  • 感谢您的好意,托马斯! ?
  • @JimL。于是又开了。随时发布您的答案:-)
  • @ThomasKilian 你能为OOA/D推荐另一本更好的书
【解决方案2】:

我会将问题更改为“是否可以将任何类的引用视为另一个类中的属性?”从技术上讲,答案是“是”,但您不应该在 UML 中那样建模。您应该将简单值建模为属性(在类的矩形内),但将非简单引用建模为关联。简单值仅由它们的值标识(例如,数字 5),而非简单引用指向具有标识的事物。在您的情况下,每个 Die 都应该有一个不同于其当前面值的身份。因此,您不应为 Die 类型的属性建模,而应在关联的末尾为属性建模。

在您发布的图表中,有 三个 (!!) 类型为 Die 的属性。一种称为die1,一种称为die2,另一种未命名,具有多重性2。在编程语言中,这将为您提供 四个 位置来存储对骰子的引用,这显然是不正确的。

我的建模方式如下:

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

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

【讨论】:

    【解决方案3】:

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

    在 OO 中,有一个巧妙的小技巧可以判断一个类是否应该包含某个其他类型的类的属性。“Is-A”和“Has-A”。

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

    如果您有另一个名为“GamblingRoom”的类,让 DiceGame 具有该“GamblingRoom”类的属性“可能”是一个可行的解决方案....当然取决于您需要做什么。

    Here's an better explanation in an similar question to what you have..但可能比我在这里所做的更好解释;)

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

    【讨论】:

    • 这个答案与问题有什么关系?
    • @JimL。 “它是如何制作的”解释得很好,特别是 HAS-AIS-A 术语帮助了我。
    • @JimL。你问这是否可能。我给了你答案,加上一点额外的内容来理解“为什么”是这样的……而 has-a is-a 术语可以帮助你理解这一点。
    【解决方案4】:

    这不仅是可能的,而且是标准情况。事实上,许多编程语言在类和基本数据类型(如int)之间没有太大区别。

    【讨论】:

      【解决方案5】:

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

      例如,可以有椅子类、桌子类和房间类。现在房间可以有椅子和桌子,所以房间类将有椅子和桌子的实例。

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        • 2010-10-03
        • 2015-07-24
        • 1970-01-01
        • 2018-12-25
        相关资源
        最近更新 更多