- 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
|
こう書くと「ここでエラー!」でエラーが出ます。
|