我知道这件事有很多问题。但就我的一生而言,我无法理解这些答案,也无法在我的例子中使用它们。我是vb.net的新手,我不能真正实现我的特定示例的一般示例。我基本上是这样的:
dim a as New list(of player)
EDIT: dim b as New list(of player) 'previously was: dim b as new player
Class player
Public name As String
'[more]
End Class
[….]
a.Add(New player)
b.Add(New player)
a(0).name="john"
b=a
a(0).name="jack"
msgbox(b(0).name) 'it will print jack instead of john
我现在可以用ICloneable来完成这项工作,但在读了很多之后,我无法正确实现。提前感谢
将a(0)
分配给b
时,它们都指向内存中的同一对象。尽管您将b
声明为New player
,但当您向现有玩家分配任务时,新玩家已被丢弃。
为了向自己证明这一点,尝试相反的方法。更改b
的name
属性,您会看到它反映在a(0)
的name
属性中。
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
您的类现在通过添加Clone
函数来实现ICloneable
。只要函数的签名与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
编辑
为了使用两个列表来实现您的目标,我创建了一个名为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