我编写了一部经典的推箱子游戏。我有一个名为" Warehouse" 的类,它代表一个仓库和一个名为" WarehouseItem" 的类,这是一个属于仓库的物品的基类。
我希望以下操作成为可能:
Dim wh as Warehouse
Dim whItem as WarehouseItem
wh.Add(whItem)
wh.Remove(whItem)
whItem.Warehouse = wh
whItem.Warehouse = Nothing
问题是我最终得到了上面的函数,试图递归地互相打电话,我不知道如何服从它(以及我犯错误的地方)。这是它的样子:
Class Warehouse
...
Items as List(Of WarehouseItem)
Sub Add(item as WarehouseItem)
Items.Add(item)
wh.Warehouse = wh // Recursive call
End Sub
...
End Class
Class WarehouseItem
...
Private mWarehouse as Warehouse
Property Warehouse As Warehouse
...
Set(wh As Warehouse)
mWarehouse = wh
mWarehouse.Add(me) // Recursive call
End Set
End Property
...
End Class
如果我能更改代码以便执行上述操作,我将不胜感激。
答案 0 :(得分:2)
你有一个无休止的递归。 A呼叫B,B呼叫A,再次呼叫B ......你需要以某种方式解决这个问题。通常,您所做的是将WarehouseItem.Warehouse
设为私有(或至少是只读),因此总是的人必须通过Warehouse.Add
添加WarehouseItem
。这意味着您不必再为Set
覆盖WarehouseItem.Warehouse
,因此不再呼叫Warehouse.Add
。
答案 1 :(得分:0)
问题是每个函数总是会调用另一个函数。您应该检查WarehouseItem
是否已添加到Items
的{{1}},并且只有在Warehouse
不添加时才会添加:
Class Warehouse
...
Items as List(Of WarehouseItem)
Sub Add(item as WarehouseItem)
If Not Items.Contains(item) Then
Items.Add(item)
wh.Warehouse = wh
End If
End Sub
...
End Class
您需要确保WarehouseItem
重载操作符等于Equals,否则包含赢得不能满足您的需求:
Class WarehouseItem
...
Public Overloads Function Equals(other As WarehouseItem) As Boolean _
Implements IEquatable(Of WarehouseItem).Equals
If other Is Nothing Then
Return False
End If
Return (Me.Id.Equals(other.Id)) //or whatever makes warehouseparts equal
End Function
现在,如果您第一次调用Warehouse.Add(WarehouseItem),它将添加它,并调用WarehouseItem.Set(Warehouse)。然后再次调用Warehouse.Add,但由于该项已被添加,因此不会执行任何操作。