vb .net swallow ICloneable实现

问题描述

我知道对此事有很多疑问。但是对于我的一生,我无法理解答案或在示例中使用答案。我是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