vb .net swallow ICloneable 实现
vb .net swallow ICloneable implementation
我知道有很多关于此事的问题。但我终究无法理解答案或在我的示例中使用它们。我是 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
您的 class 现在通过添加 Clone
函数实现 ICloneable
。只要函数的签名与 Clone
方法的接口签名相匹配,您就可以实现它。
请注意,我的实现正在创建一个 New
播放器并将 name
属性 分配给现有播放器的 name
。这个 New player 是函数返回的内容。新玩家将在内存中有不同的位置,因此更改为列表中的第一个玩家和这个新玩家不会相互影响。
由于 Clone
函数 returns 一个对象,我们需要将其转换为 player
(基础类型)以便它匹配我们声明的 b
和我们将能够使用 player
class.
的属性和方法
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
的新 class。它继承了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
我知道有很多关于此事的问题。但我终究无法理解答案或在我的示例中使用它们。我是 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
您的 class 现在通过添加 Clone
函数实现 ICloneable
。只要函数的签名与 Clone
方法的接口签名相匹配,您就可以实现它。
请注意,我的实现正在创建一个 New
播放器并将 name
属性 分配给现有播放器的 name
。这个 New player 是函数返回的内容。新玩家将在内存中有不同的位置,因此更改为列表中的第一个玩家和这个新玩家不会相互影响。
由于 Clone
函数 returns 一个对象,我们需要将其转换为 player
(基础类型)以便它匹配我们声明的 b
和我们将能够使用 player
class.
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
的新 class。它继承了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