当您分配a(0)
给b
它们时,它们都指向内存中的同一个对象。即使您在将任务分配给现有玩家时声明b
该New player
新玩家已被丢弃。
为了向自己证明这一点,请尝试相反的方法。更改 的name
属性,b
您会看到它反映在 的name
属性中a(0)
。
Private Sub OPCode()
Dim a As New List(Of player)
Dim b As player
a.Add(New player)
a(0).name = "john"
b = a(0)
b.name = "jack"
MsgBox(a(0).name) 'jack
End Sub
现在克隆...
Class player
Implements ICloneable
Public name As String
'[more]
Public Function Clone() As Object Implements ICloneable.Clone
Dim p As New player
p.name = name
Return p
End Function
End Class
您的类现在ICloneable
通过添加该Clone
函数来实现。只要函数的签名与Clone
方法的接口签名匹配,您就可以按照自己的意愿实现它。
请注意,我的实现是创建一个New
播放器并将name
属性分配给name
现有播放器的。这个新玩家是函数返回的内容。新玩家将在内存中具有不同的位置,因此更改为列表中的第一个玩家和这个新玩家不会相互影响。
由于Clone
函数返回一个对象,我们需要将它转换为player
(底层类型),以便它与我们的声明相匹配b
,我们将能够使用player
该类的属性和方法。
Private Sub OPCode()
Dim a As New List(Of player)
Dim b As player
a.Add(New player)
a(0).name = "john"
b = CType(a(0).Clone, player)
a(0).name = "jack"
MsgBox(b.name) 'john
End Sub
编辑
为了使用 2 个列表来实现您的目标,我创建了一个名为PlayerList
. 它继承List(Of Player)
并实现ICloneable
. 您现在可以克隆列表a
并获得由单独的播放器对象组成的完全独立的列表。
Public Class PlayerList
Inherits List(Of player)
Implements ICloneable
Public Function Clone() As Object Implements ICloneable.Clone
Dim newList As New PlayerList
For Each p As player In Me
Dim newP = CType(p.Clone(), player)
newList.Add(newP)
Next
Return newList
End Function
End Class
Private Sub OPCode()
Dim a As New PlayerList()
Dim b As PlayerList
a.Add(New player)
a(0).name = "john"
b = CType(a.Clone, PlayerList)
a(0).name = "jack"
MsgBox(b(0).name)
End Sub