首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vb .net吞吐ICloneable实现

vb .net吞吐ICloneable实现
EN

Stack Overflow用户
提问于 2020-08-24 01:34:03
回答 1查看 56关注 0票数 0

我知道在这件事上有很多问题。但在我的生活中,我无法理解这些答案,也无法在我的例子中使用它们。我在vb .net中是新的,我不能真正实现我的特定示例的一般示例。我所拥有的基本上是:

代码语言:javascript
复制
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

……

代码语言:javascript
复制
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完成这一任务,但是在阅读了大量关于它的内容之后,我无法正确地实现。提前谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-24 04:39:31

当您将a(0)分配给b时,它们都指向内存中的同一个对象。即使您将b声明为New player,但当您将任务分配给现有的播放器时,新的播放器就被丢弃了。

要向自己证明这一点,请尝试相反的方法。更改name属性b,您将看到它反映在a(0)name属性中。

代码语言:javascript
复制
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

现在给克隆人。

代码语言:javascript
复制
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。这个New是函数返回的内容。新玩家将在内存中有一个不同的位置,所以从列表中更改到第一个玩家,这个新玩家不会影响对方。

因为Clone函数返回一个对象,所以我们需要将它转换为player (底层类型),这样它将匹配我们的b声明,并且我们将能够使用player类的属性和方法。

代码语言:javascript
复制
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,并获得完全独立的列表,其中包含单独的player对象。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63553647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档