两个类之间的逻辑问题

时间:2014-12-05 10:31:23

标签: recursion

我编写了一部经典的推箱子游戏。我有一个名为" 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

如果我能更改代码以便执行上述操作,我将不胜感激。

2 个答案:

答案 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,但由于该项已被添加,因此不会执行任何操作。