【问题标题】:How to write constructor where the types are from another class in Java?java - 如何编写类型来自Java中另一个类的构造函数?
【发布时间】:2022-01-10 11:38:07
【问题描述】:

我正在为 Connect 四 游戏制作 UML 图。这是一款两人连接的棋盘游戏,玩家选择一种颜色,然后轮流将彩盘投入七列六行垂直悬挂的网格中。

我的 UML 图有问题。班级游戏有 2 个来自另一个班级的变量(可以吗?)。其次,如何为所有给定变量编写构造函数?

注意:UML 图的目的不是用它写代码,而只是作为一个项目。没有要求。

【问题讨论】:

  • 在另一个类中有一个类的实例是可以的,但你必须检查没有循环依赖。 A类需要B,B类需要A。
  • 请您根据我的例子这么说。您的意思是玩家不应该与董事会有联系?@SeyedMohammadAminAtyabi
  • 我认为创建 Game 实例没有问题。首先你实例化 Player。然后使用这个实例来实例化 Gameboard。之后使用这两个实例,您可以实例化 Game。
  • 只问最后一件事,你认为这个 UML 好吗?它有什么错误(循环依赖除外)吗?我应该包括更多的方法吗?@SeyedMohammadAminAtyabi
  • 好吧,我不知道这个游戏,但我看到了一些可以删除的方法。例如在 Gameboard 类中有两个方法 redWind 和 blueWin。这可以简化为 getWinner。

标签: java inheritance uml class-diagram


【解决方案1】:

具有其他类型属性的类

我们以GamePlayer 为例。在您的图表中,您显示了一个属性playernames: Player[]。这意味着Game 类与Player 类隐式关联。同时,您显示与Player 类的显式关联。这是模棱两可的:隐式和显式关联是否相同?还是这两种不同的关联?

一种不太明确的表示是从类的隔间中删除属性,并将其可见性和名称显示为另一端的关联线上的角色。

另一个例子是类的Game 属性board:Board。同时,与Gameboard 有关联。这两个是否相同,并且其中一个类名有错误?或者您是否忘记了图表中的«interface» BoardGame 应该与之关联并且Gameboard 将实现?由你来澄清。

如果可能,请指出关联的多样性。如果它正好是 1,或者正好是 2,把它写下来。如果是多个,请写一个*

构造函数

在 UML 中,构造函数与其他运算符一样是运算符。它可以有任何名称,并且应该返回与所属类相对应的类型。前面应该是刻板印象«Create»

+ «Create» Game():Game 

在您的班级中,您还有一个相关的操作(备注:在 UML 中,不返回任何内容的操作不会返回 void,但什么都没有):

+ initialize() 
+ setBoard (board: Board)

读者可以推断该板是在其他地方创建的,可能需要设置。但是,您的图中没有指定构造函数或初始化程序中的哪个创建/构造剩余属性的其他对象。如果这对您很重要,您可以添加纯文本注释。如果你更喜欢更正式的方式,你可以表达一个后置条件。

如果Game 没有创建它的某些属性,例如,如果您的用户界面将创建Player 对象,然后将其传递给构造函数,您需要在操作规范中指明这些对象,在与 Java 相同:

+ «Create» Game(player: Player[2]):Game 

但如果你设置了棋盘,你也可以设置(或添加)玩家。

无关言论

  • 几个Game 操作返回Person,但没有这样的类。 (您可以在图表中添加这样的类并绘制依赖项)。
  • playernames 属性的名称具有误导性:它是玩家,而玩家不仅仅是名称。也是积分、状态以及成就球员的一切因素。
  • 您能解释一下为什么要在关联上加上箭头吗?如果没有,最好删除它们。
  • Extends 不是 UML 关键字。只需删除它:您绘制的专业化就足够了:它意味着继承。对于已实现的接口,您将使用相同的符号,但使用虚线。

【讨论】:

  • Game 使用 Board 作为属性。它应该(可能)是boardGameboard 的角色。无论如何,它看起来是错误的。关于Extends :它只是任意泛化的名称。这没有错,只是令人困惑和毫无意义。
  • @qwerty_so 是的,这看起来像是类名不匹配。如果这一点得到证实,那么使用+board 角色肯定是不那么模棱两可的方式。我也可以很好地想象界面方法,board 是 Gameboard 将实现的界面的一个角色。
  • FWIW:UML 2.5 规范使用 «Create»(大写 C);见第678. 我知道 EA 忽略了刻板印象的情况(但并非总是如此)。无论如何,您应该按照指定的方式使用它。
  • @qwerty_so 好的,我会大写。但仅仅是因为小写在文体上已经过时,正如 p.262 告诉我们的那样:“Stereotype 定义和应用程序的名称之间的匹配是不区分大小写的,所以 用小写字母命名stereotype 应用程序,其中原型是使用大写字母定义是有效的,尽管在​​风格上已经过时。由于遗留原因,即使以大写字母定义,工具也可能会以小写字母显示原型名称。“ -​​ 我不想促进坏习惯;-)
  • 我们只想在这里看到正确的答案 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多