根据顺序图,我首先应创建一个以参数“ item”为对象的方法“ regisreItem(Item item)”。我看到我的问题是,在方法“ regisreItem(Item item)”之后调用“ items”的构造函数,这样我就没有什么要插入到根据序列图的“ regisreItem(Item item)”方法中。还是不?
序列图
类图
这是我感兴趣的序列图的一部分
https://drive.google.com/open?id=1eJolWNoN32IubP3iaaXPc_cLM5Es08hK 这是我的全部代码。
请提供给我一些可以实现的代码。 并阐明序列图的开始。
答案 0 :(得分:0)
您可以使用以下方法来解决在registerItem之后调用Item构造函数的问题:
registerItem(new Item(...));
并传入项目i1
和i2
的属性。这将创建新的项目,然后可以将其添加到拍卖项目列表中。
我假设顺序图的开始是拍卖师创建或打开一个已经创建的拍卖,然后通过重复调用registerItem(new Item(...));
来添加将在拍卖中使用的物品清单,然后再进行竞标由Max和Moritz通过Auction
对象添加到他们
答案 1 :(得分:0)
由于操作registerItem
需要一个项目作为参数,因此Auctioneer对象需要在调用该操作之前创建它。这意味着拍卖师必须发送创建消息,而不是拍卖消息(在序列图中无法使用new Item()
作为参数,而且无论如何也不会更改创建者)。 i1
和i2
是交互的属性。它们可以用作registerItem
的参数。
addBid
还期望有bidder
。同样,此处应使用交互的属性Max
和Moritz
。
在实际程序中,这些交互属性将是Auction::addBid
操作或Auctioneer的临时变量。拍卖师可能不应该拥有变量,因此registerItem
操作应该仅具有通用数据类型,例如string
作为参数。
Auction
应该将消息发送到i1
和i2
,但是,由于这些是交互的属性,因此Auction
对象不知道它们。可以省略此详细信息,但是最好显示Auction
如何找到相关的Item
,例如,调用自身的findItemByName
操作。
更好的选择是让Auction
将消息发送到其自己的属性allItems
。然后,两条生命线将代表相同的属性,但对象不同。选择器可用于区分此属性定义的插槽中的两个对象(allItems[0]
,allItems[1]
,这是可选的)。这适用于allBids
而不是b300EUR
等。