Recursion 两类之间的逻辑问题

Recursion 两类之间的逻辑问题,recursion,Recursion,我正在编写一个经典的Sokoban游戏。我有一个名为“Warehouse”的类,它表示一个仓库,还有一个名为“WarehouseItem”的类,它是属于仓库的项目的基类 我希望可以进行以下操作: Dim wh as仓库 暗白色作为仓库物品 wh.Add(whItem) wh.删除(whItem) whItem.Warehouse=wh whItem.Warehouse=无 问题是,我最终得到了上面的函数,它们试图递归地互相调用,但我不知道如何遵守它(以及我在哪里犯了错误)。下面是它的样子:

我正在编写一个经典的Sokoban游戏。我有一个名为“Warehouse”的类,它表示一个仓库,还有一个名为“WarehouseItem”的类,它是属于仓库的项目的基类

我希望可以进行以下操作:

Dim wh as仓库
暗白色作为仓库物品
wh.Add(whItem)
wh.删除(whItem)
whItem.Warehouse=wh
whItem.Warehouse=无
问题是,我最终得到了上面的函数,它们试图递归地互相调用,但我不知道如何遵守它(以及我在哪里犯了错误)。下面是它的样子:

类仓库
...
作为列表的项目(仓库项目)
子添加(项目作为仓库项目)
项目。添加(项目)
仓库=仓库//递归调用
端接头
...
末级
类别仓库物品
...   
私人仓库
作为仓库的财产仓库
...
设置(仓库为仓库)
mWarehouse=wh
mWarehouse.Add(me)//递归调用
端集
端属性
...
末级

如果您能就如何更改代码以执行上述操作提供建议,我将不胜感激。

问题是每个函数总是调用另一个函数。您应该检查
仓库
项目
是否已添加到
仓库
项目
,并且仅在以下情况下添加:

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
重载相等运算符,否则Contains将无法满足您的要求:

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 

现在,如果您第一次调用WarehouseItem.Add(WarehouseItem),它将添加它,并调用WarehouseItem.Set(Warehouse)。然后再次调用Warehouse.Add,但不会执行任何操作,因为该项已被添加。

您有一个无休止的递归。A叫B,B叫A,A又叫B。。。你得想办法把它打破。通常,您要做的是将
WarehouseItem.Warehouse
设置为私有(或至少是只读),因此人们总是必须通过
Warehouse.Add
来添加
WarehouseItem
。这意味着您不必再为
WarehouseItem.Warehouse
重写
Set
,因此它将不再调用
Warehouse.Add

这是面向对象编程中的一个非常常见的初学者问题,并不特定于游戏开发。