net燕子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,但当您向现有玩家分配任务时,新玩家已被丢弃。

为了向自己证明这一点,尝试相反的方法。更改bname属性,您会看到它反映在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

相关内容

  • 没有找到相关文章

最新更新