【问题标题】:Can not understand the sequence of method and constructor看不懂方法和构造函数的先后顺序
【发布时间】:2019-07-17 15:28:04
【问题描述】:

根据序列图,我应该首先创建方法“regisreItem(Item item)”,参数“item”作为对象。我看到我的问题是,在方法“regisreItem(Item item)”之后调用了“items”的构造函数,因此我没有任何东西可以根据序列图插入到“regisreItem(Item item)”方法中。还是不行?

时序图

类图

这是我感兴趣的序列图的一部分

https://drive.google.com/open?id=1eJolWNoN32IubP3iaaXPc_cLM5Es08hK 这是我所有的代码。

请提供一些代码,是否可以实现。 并阐明序列图的开头。

【问题讨论】:

  • 投票关闭,因为它只是 SD 错误,因此无法理解。

标签: java uml


【解决方案1】:

由于操作registerItem 需要一个项目作为参数,Auctioneer 对象需要在调用操作之前创建它。这意味着 Auctioneer 必须发送创建消息,而不是 Auction(在序列图中使用 new Item() 作为参数是不可能的 - 而且它不会改变创建者)。 i1i2 是交互的属性。它们可以用作registerItem 的参数。 addBid 也需要 bidder。同样,此处应使用交互的属性MaxMoritz

在实际程序中,这些交互属性将是 Auction::addBid 操作或 Auctioneer 的临时变量。 Auctioneer 可能不应该有变量,因此 registerItem 操作可能应该只有通用数据类型,例如 string 作为参数。

Auction 应该向i1i2 发送消息,但是,由于这些是交互的属性,Auction 对象不知道它们。可以省略这个细节,但最好显示Auction 如何找到相关的Item,例如通过调用自身的findItemByName 操作。

更好的选择是让Auction 将消息发送到它自己的属性allItems。那么两条生命线将代表相同的属性,但具有不同的对象。选择器可用于区分此属性定义的插槽中的两个对象(allItems[0]allItems[1],这是可选的)。同样适用于allBids 而不是b300EUR 等。

【讨论】:

    【解决方案2】:

    您可以使用以下方法解决在 registerItem 之后调用 Item 构造函数的问题:

    registerItem(new Item(...));
    

    并传入项目i1i2的属性。这将创建新物品,然后可以将其添加到拍卖物品列表中。

    我假设序列图的开始是拍卖师创建或打开已创建的拍卖,然后通过重复调用 registerItem(new Item(...)); 添加将在拍卖中使用的物品列表,然后可以将出价添加到Max和Moritz通过Auction对象

    【讨论】:

    • 好的,谢谢,我明白了,但似乎不清楚如何通过 registerItem(new Item(...)) 创建 i1 项目,实际上将称为 i1。如何命名我的新对象 i1?
    • 也许 registerItem(new Item("item1", "an item desc", 200));然后在 registerItem 方法中,这将作为创建的项目 item 进入,所以你可以说 list.add(item)。这会将项目添加到列表中。
    • 我没明白你说的“200e”是什么意思?
    • 很抱歉,我按下回车键时没有意识到它会发布而不是换行。我是新来的
    • 我的意思是如何将新对象命名为 i1,我知道可以在构造函数中插入属性,但实际上我还需要以某种方式调用新对象。例如通常这样调用构造函数:Item item1=new Item("item1", "an item desc", 200)。在这段代码中“registerItem(new Item("item1", "an item desc", 200))" 我不明白我怎么能将对象命名为 "item1"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2013-06-24
    • 2016-03-18
    • 1970-01-01
    • 2012-03-01
    相关资源
    最近更新 更多