【问题标题】:vb .net swallow ICloneable implementationvb .net 燕子 ICloneable 实现
【发布时间】:2020-08-24 01:34:03
【问题描述】:

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

【问题讨论】:

  • 与 C# 一样,VB.NET 中的赋值复制/克隆/复制对象。 ab 在赋值后引用同一个对象。也就是说,变量引用同一个集合,第一个元素也是(隐式)同一个 Player..
  • 期望的行为可能是“克隆集合中的所有对象”,尽管它并不完全清楚共享对象可变性的哪一部分是一个问题。
  • b=a 毫无意义。 a 是玩家列表,b 是玩家。你的意思是b = a(0)
  • @Mary 这是我的错。 a 和 b 都是列表

标签: vb.net implementation icloneable


【解决方案1】:

当您将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

您的类现在实现了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

【讨论】:

  • 非常感谢。看起来我几乎做对了,但有些地方我做错了,但现在这一切对我来说更有意义,它按预期工作。那么我想知道,你能做到b=a.clone吗?其中 a 和 b 都是 lists of player 或者更容易将其放入循环中,b(i)=a(i).clone
  • @Monochromatic 你不能做b = a.Clone,因为List(Of T) 没有实现ICloneable。但是,如果 a 是一个本身实现了 ICloneable 的类型的实例,则可以这样做。
  • @Monochromatic 请参阅我答案的编辑部分。
猜你喜欢
  • 2010-12-14
  • 2010-10-16
  • 1970-01-01
  • 2015-03-31
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
相关资源
最近更新 更多