- PR -

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

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-24 19:53
残念。無理です。
Clone() を virtual にしておいて…っていうのも、インスタンスが「派生したクラス」でないと駄目ですね。

「派生したクラス」の方が「基本クラス」を受け取る準備をするしかないです。
From基本クラス()メソッドやコンストラクタで。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-25 00:11
引用:

R・田中一郎さんの書き込み (2006-01-24 19:31) より:

基本クラスから派生したクラスにコピーすることはできませんか?
こう書くと「ここでエラー!」でエラーが出ます。


派生クラスにしかない情報を考慮しないのであれば、できないこともないです。

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

囚人さんの書き込み (2006-01-24 19:53) より:

残念。無理です。
Clone() を virtual にしておいて…っていうのも、インスタンスが「派生したクラス」でないと駄目ですね。

「派生したクラス」の方が「基本クラス」を受け取る準備をするしかないです。
From基本クラス()メソッドやコンストラクタで。



やはり、自分で値を引き渡す部分を書かないと駄目なのですね。
了解です。ありがとうございました。

引用:

じゃんぬねっとさんの書き込み (2006-01-25 00:11) より:

派生クラスにしかない情報を考慮しないのであれば、できないこともないです。



考慮しないで良いです。
先のコードで言うところの「属性」プロパティですよね。
この値は、どうなっても良いです。
どうすれば良いのでしょう?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-25 15:30
引用:

R・田中一郎さんの書き込み (2006-01-25 14:26) より:

どうすれば良いのでしょう?


すいません、書き方が適切ではなかったです。

MemberwiseClone メソッドで生成されたクローンでは、ダウンキャストができません。
MemberwiseClone メソッドに頼らず、目的の型に対して手動でコピーしなければなりません。

ダウンキャストが出来るのは、"格納している型が" 基底型と言いつつも、
元々のインスタンスの "実際の型" がその型と互換があるものです。

格納されたインスタンスの "実際の型" が変わるわけではないので、
ダウンキャストに際し、インターフェイスを介してもダメということです。

つまり、ダウンキャストは、
 「オブジェクトを示すメモリ領域の位置は変わらない」
 「コピーしているわけではない」
ということです。
(格納している型と、実際の型の話が混ざっているので読みにくいですね...)

囚人さんの例にもあるように、

> 「派生したクラス」の方が「基本クラス」を受け取る準備をするしかないです。
> From基本クラス()メソッドやコンストラクタで。

とするか、基本クラスが準備してしまうことになりますが、
どちらにしても、あまり良いパターンではありません。
それをやるくらいならば、MemberwiseCopy メソッドは使う "価値" がないです。

どちらかと言えば、前者の案の方が良いでしょう。
(後者だと、派生クラス側で実装を隠す必要が出てくるため)

# 何度も書き直しました... ( ̄- ̄;)

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

じゃんぬねっとさんの書き込み (2006-01-25 15:30) より:

MemberwiseClone メソッドで生成されたクローンでは、ダウンキャストができません。
MemberwiseClone メソッドに頼らず、目的の型に対して手動でコピーしなければなりません。

ダウンキャストが出来るのは、"格納している型が" 基底型と言いつつも、
元々のインスタンスの "実際の型" がその型と互換があるものです。

格納されたインスタンスの "実際の型" が変わるわけではないので、
ダウンキャストに際し、インターフェイスを介してもダメということです。

つまり、ダウンキャストは、
 「オブジェクトを示すメモリ領域の位置は変わらない」
 「コピーしているわけではない」
ということです。
(格納している型と、実際の型の話が混ざっているので読みにくいですね...)



いや、凄く分かりやすい説明だと思います。
この部分に関しては、コピーしたものをキャストしてみたり、基本クラスからオブジェクトを生成させたものをキャストさせたり、と色々と試してみたのですが、上記の説明を読めば納得できます。

ありがとうございました。

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