0

我知道这件事有很多问题。但在我的一生中,我无法理解答案或在我的示例中使用它们。我是 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 来完成,但是在阅读了很多内容之后,我无法正确实现。先感谢您

4

1 回答 1

1

当您分配a(0)b它们时,它们都指向内存中的同一个对象。即使您在将任务分配给现有玩家时声明bNew player新玩家已被丢弃。

为了向自己证明这一点,请尝试相反的方法。更改 的name属性,b您会看到它反映在 的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,我们将能够使用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

编辑

为了使用 2 个列表来实现您的目标,我创建了一个名为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
于 2020-08-24T04:39:31.357 回答