• ベストアンサー

子クラスのオブジェクトに親クラスのオブジェクトを代入

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが 子クラスのオブジェクトに、親クラスのオブジェクトを代入する方法が分からなくて困っています><。 ソースコードで説明すると class Car { } class Bike:Car { } Car oya = new Car(); Bike kodomo = new Car(); kodomo = oya;//これはエラーになる というかんじです。 これが代入できるような方法はないでしょうか? かなり抽象的な質問ですが、よろしければ御回答をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.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);

lain_003
質問者

お礼

はう><一応、MemberwiseClone関数を使おうと思っていました。 すいません説明不足でした。 やはり一つ一つメンバを代入したほうがいいのですね。 なるほど・・インスタンスで代入をつかえばいいんですね! みなさん、たくさんのご回答ありがとうございました。 おかげさまで解決できました。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

他の方がお書きのように、「子クラスの"変数"に、親クラスのオブジェクトの代入」は出来ません。 ただ、「子クラスのオブジェクトに・・・」とお書きと言うことは、実は代入じゃなくて、オブジェクトからオブジェクトへのメンバのコピーがしたいのではないでしょうか。C#はよく知りませんが、メンバーを個別にコピーすればいいかと。 ただ、いずれにせよ、設計が悪いです。

lain_003
質問者

補足

そうなんです><メンバをコピーしたいんです。 >>メンバーを個別にコピーすればいいかと それが結構メンバが多くてひとつひとつ書いていくと結構な数になってしまいそうで・・・。 >>ただ、いずれにせよ、設計が悪いです やはりそうなんですか・・・。 しかし、代入しないようにするやり方が思いつけない>< もしかして、親クラスはオブジェクトをあまり作らずに、できるだけ子クラスで作ったほうがいいんでしょうか?

回答No.3

#2さんもおっしゃっていますが、 そのようなコードが必要だという場合、設計がまずいのでやり直したほうがいいです。 また継承やポリモフィズムについて、もう少し勉強しないと、ですね。

lain_003
質問者

補足

ソースコード間違ってました>< またこれとは別に、親クラスのオブジェクトを子クラスのオブジェクトに入れなければいけない状態って避けるべきでしょうか?

  • precog
  • ベストアンサー率22% (966/4314)
回答No.2

継承ですよね? それはバグの元だからやったらダメです。 親のメソッドは親に書いてください。

lain_003
質問者

補足

すいません・・・ソースコード書きミスです・・・申し訳ない・・

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

逆は可能ですが、それは無理じゃないかな。 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;

lain_003
質問者

補足

・・・は!しまった>< すいません、コード書き間違えてました>< Bike kodomo = new Bike(); ほんとすいません><

関連するQ&A