- ベストアンサー
子クラスのオブジェクトに親クラスのオブジェクトを代入
開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが 子クラスのオブジェクトに、親クラスのオブジェクトを代入する方法が分からなくて困っています><。 ソースコードで説明すると class Car { } class Bike:Car { } Car oya = new Car(); Bike kodomo = new Car(); kodomo = oya;//これはエラーになる というかんじです。 これが代入できるような方法はないでしょうか? かなり抽象的な質問ですが、よろしければ御回答をお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
kodomo = oya これはあくまで、ポインタ的なものがコピーされるだけです。(インスタンスのクローン(複製)ができるわけではない) 質問を見る限りその辺りが理解できていないと思います。 class Car { public int a; } Car oya = new Car(); oya.a = 10; Car kodomo = new Car(); kodomo = oya; kodomo.a = 100; とすると oya.aも100になります。(kodomoとoyaが同じインスタンスだから) ※ちなみにclassではなくstructにすれば、oyaとkodomoは別物になります。 >もしかして、親クラスはオブジェクトをあまり作らずに、できるだけ子クラスで作ったほうがいいんでしょうか? それをするなら、そもそもCarとBikeの定義をわける必要が無かったということになります。 一つの方法として 以下のようにコンストラクタに親クラスを渡してメンバをコピーする事もできるでしょう。 class Car { public int a; } class Bike : Car { public Bike(Car car) { a = car.a; } } Car oya = new Car(); Bike kodomo = new Bike(oya);
その他の回答 (4)
- notnot
- ベストアンサー率47% (4900/10358)
他の方がお書きのように、「子クラスの"変数"に、親クラスのオブジェクトの代入」は出来ません。 ただ、「子クラスのオブジェクトに・・・」とお書きと言うことは、実は代入じゃなくて、オブジェクトからオブジェクトへのメンバのコピーがしたいのではないでしょうか。C#はよく知りませんが、メンバーを個別にコピーすればいいかと。 ただ、いずれにせよ、設計が悪いです。
補足
そうなんです><メンバをコピーしたいんです。 >>メンバーを個別にコピーすればいいかと それが結構メンバが多くてひとつひとつ書いていくと結構な数になってしまいそうで・・・。 >>ただ、いずれにせよ、設計が悪いです やはりそうなんですか・・・。 しかし、代入しないようにするやり方が思いつけない>< もしかして、親クラスはオブジェクトをあまり作らずに、できるだけ子クラスで作ったほうがいいんでしょうか?
- galma_zabi
- ベストアンサー率33% (41/124)
#2さんもおっしゃっていますが、 そのようなコードが必要だという場合、設計がまずいのでやり直したほうがいいです。 また継承やポリモフィズムについて、もう少し勉強しないと、ですね。
補足
ソースコード間違ってました>< またこれとは別に、親クラスのオブジェクトを子クラスのオブジェクトに入れなければいけない状態って避けるべきでしょうか?
- precog
- ベストアンサー率22% (966/4314)
継承ですよね? それはバグの元だからやったらダメです。 親のメソッドは親に書いてください。
補足
すいません・・・ソースコード書きミスです・・・申し訳ない・・
- sha-girl
- ベストアンサー率52% (430/816)
逆は可能ですが、それは無理じゃないかな。 new Car();とした時点でインスタンスが作成されるわけですが、そのインスタンスは Bikeの情報を持っていませんから。 ですからBike kodomo = new Car() as Bike;とすると 変換できずkodomoにnullが入ります。 Car kodomo = (Car)new Bike(); としてCarに入れた後で Bike bike = (Bike)kodomo; としてBike型に戻すことは出来ます。 またkodomoがBikeに変換できるかどうかをチェックするのに if (kodomo is Bike) { Bike bike = (Bike)kodomo; } としてもいいですし、 Bike bike = kodomo as Bike; // その型への変換できないならnullが入ります。 if (null != bike) { } とする事もできます。 基本的にC#のクラスはObjectを継承するのでObject型でもいいです。 object kodomo = (object)new Bike(); Bike bike = (Bike)kodomo;
補足
・・・は!しまった>< すいません、コード書き間違えてました>< Bike kodomo = new Bike(); ほんとすいません><
お礼
はう><一応、MemberwiseClone関数を使おうと思っていました。 すいません説明不足でした。 やはり一つ一つメンバを代入したほうがいいのですね。 なるほど・・インスタンスで代入をつかえばいいんですね! みなさん、たくさんのご回答ありがとうございました。 おかげさまで解決できました。