- PR -

オブジェクトのコピーってどうやるんですか?

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-21 18:19
考えてみたら、今まで、やったことがありませんでした。
何か簡単にできる方法とか無いですか?

例えば、

コード:

private class 人
    public 名前 as string
    public 性別 as string
    public 血液型 as string
end class

private sub 登録()
    dim 一郎さん as new 人
    一郎さん.名前 = "一郎"
    一郎さん.性別 = "男性"
    一郎さん.血液型 = "O型"

    dim 二郎さん as 人 = 一郎さん
    二郎さん.名前 = "二郎"
end sub



こう書いた場合は、当然一郎さんの名前は二郎になってしまいます。
しかし、一郎さんの名前は一郎のままにしたいのです。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-21 18:36
こんにちは。

メンバを全てコピーしたら良いです。

…という方法もありますが、人自身が「コピーという概念」を持てば宜しいかと。
ICloneable を実装してクローンを作れる事を明示してやり、人クラスが実装すればよいのです。どのようにコピーするかは、「人」が決めれば良いです。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-21 18:40
MemberwiseClone メソッドですね。
ただし、シャローコピーと、ディープコピーについても調べてみてくださいね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-12-21 19:07
> 何か簡単にできる方法とか無いですか?

構造体とか。

# 取り扱い注意
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-21 19:41
引用:


囚人さんの書き込み (2005-12-21 18:36) より:

ICloneable を実装してクローンを作れる事を明示してやり、人クラスが実装すればよいのです。どのようにコピーするかは、「人」が決めれば良いです。




了解です。人のクローンを作れるようにするしか無いのですね。
禁断の世界ですが、王道な方法だと思いました。
ICloneableについては、先ほど調べてみました。ありがとうございました。

引用:


じゃんぬねっとさんの書き込み (2005-12-21 18:40) より:

ただし、シャローコピーと、ディープコピーについても調べてみてくださいね。



先ほど調べてみました。
人クラスがオブジェクトを持ったときに、とても重要ですね。ありがとうございました。

引用:

todoさんの書き込み (2005-12-21 19:07) より:
> 何か簡単にできる方法とか無いですか?

構造体とか。

# 取り扱い注意



そうですね。考えてみれば、構造体を使えば簡単にできますね。

#ちなみに構造体は、シャローコピー。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-21 19:56
シャローコピーとディープコピーの例です。
VB.NET ということでしたので、VB.NET で書きました。

コード:

Public Class WankumaData : Implements System.ICloneable

  #Region " このクラスのメンバ "

    Public MemberCode As Integer
    Public MemberName As String
    Public Skills     As System.Collections.ArrayList

  #End Region

  #Region " コンストラクタ "

    Public Sub New()
        Me.Skills = New System.Collections.ArrayList()
    End Sub

  #End Region

  #Region " ShallowCopy メソッド "

    Public Function ShallowCopy() As WankumaData
        Return DirectCast(Me.Clone(), WankumaData)
    End Function

  #End Region

  #Region " DeepCopy メソッド "

    Public Function DeepCopy() As WankumaData
        Dim hWankuma As WankumaData = DirectCast(Me.Clone(), WankumaData)

        hWankuma.Skills = DirectCast(Me.Skills.Clone(), System.Collections.ArrayList)

        Return hWankuma
    End Function

  #End Region

  #Region " Implements System.ICloneable.Clone メソッド "

    Private Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone()
    End Function

  #End Region

End Class


シャローコピーの場合、参照型はコピー元の参照先と同じになります。
ですので、コピー先を変更するとコピー元まで変更されてしまいます。
(変更というよりは、同じ参照先を見ているから)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-22 13:03
引用:

じゃんぬねっとさんの書き込み (2005-12-21 19:56) より:

シャローコピーとディープコピーの例です。
VB.NET ということでしたので、VB.NET で書きました。




ありがとうございます。丁度悩んでいたところなので凄く助かります。
しかも、region を使った実例もわかって、かなり参考になります。

引用:

じゃんぬねっとさんの書き込み (2005-12-21 19:56) より:

シャローコピーの場合、参照型はコピー元の参照先と同じになります。
ですので、コピー先を変更するとコピー元まで変更されてしまいます。
(変更というよりは、同じ参照先を見ているから)




この辺りは、ほぼ理解できました。
ありがとうございました。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-24 19:31
基本クラスから派生したクラスにコピーすることはできませんか?

コード:

public class 基本クラス:implements System.ICloneable
    public 番号 as integer
    public 名称 as string

    public function Clone() As Object Implements System.ICloneable.Clone
	Return (Me.MemberwiseClone())
    end function
end class

public class 派生したクラス:inherits 基本クラス
    public 属性 as string
end class

public class 偉いクラス
    public sub New()
        dim 基本 as 基本クラス
        基本.番号 = 1
        基本.名称 = "R・田中一郎"
        dim 派生 as new 派生したクラス
        派生 = 基本.Clone()            <===========ここでエラー!
        派生.属性 = "稼動中"
    end sub
end class


こう書くと「ここでエラー!」でエラーが出ます。

スキルアップ/キャリアアップ(JOB@IT)