- - PR -
Object クラスの clone メソッドが protected なので使いづらい
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-07-12 11:17
多分Java作った人たちが、魔法のようにshallow copyをやろうとしたのが、失敗の始まりだったのではないかと思います。 ただ、C#形式も、どうなんでしょうね。確かに単純で素直な感じはするんですけど、 IClonebaleを実装したクラスを継承した時に、フールドが増えたら、必ずClone()をオーバーライドする事を注意しておかないといけない(なんとなく、C#なら、コンパイル警告が出そう)。 さりとて、Javaの魔法のshallow copyだって、結局フィールドによっては、deep copyしないといけない場合があって、そこが落とし穴になるし。
なるほど、Javaなら、B#clone()で、super.clone()を呼んでおけばokってことですね。 | ||||||||||||
|
投稿日時: 2003-07-12 13:40
そうなんですよね、でも正直、Clone()をオーバーライドすることを忘れなければ、C#の方が単純さの分だけ勝っているんじゃないかと思ってました。でも、実際にオーバーライドしようとコードを組んでみたところ、B::Clone()の中でどうA::Clone()を呼び出したらいいのかわからないんです。A::Clone()が返すのはAのインスタンスで、それから??って感じで。Webで調べても出てこないし、下のようなコードなら出てきたんですが・・・
悩ましい。 #追記 というか、本来こうするのが正しい使い方なのかも。 すみません、Java板なのを忘れているわけではないです。clone()がどうあるべきかという話で・・・ [ メッセージ編集済み 編集者: ocean 編集日時 2003-07-12 14:10 ] | ||||||||||||
|
投稿日時: 2003-07-13 10:34
C#に関しては全くの無知なので、完全にあてずっぽうですが、コピーコンストラクタを経由するとか。
C#の文法は、わかんないので、JavaにIClonableがあったとしたらということで、考えてみました。
| ||||||||||||
|
投稿日時: 2003-07-13 16:34
ええ、そうです。すみません、私の書き込みではコンストラクタだと明示してませんでした。
うのきちさんの示されたコードの方が、今のJavaのclone()より美しいと感じます。このコードなら、親クラスにコピーコンストラクタがなくても、それを呼びさえしなければ(望ましいかどうかは別問題として)子クラスでのICloneableの実装を妨げませんし・・・ こうして欲しいなあ(無理か・・・) |
«前のページへ
1|2|3