问题描述
我知道对此事有很多疑问。但是对于我的一生,我无法理解答案或在示例中使用答案。我是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
,当您将任务分配给现有玩家时,新玩家也被扔掉了。
要向自己证明这一点,请尝试相反的操作。更改name
的{{1}}属性,您将看到它反映在b
的{{1}}属性中。
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
编辑
为了使用2个列表来实现您的目标,我创建了一个名为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