「覚え間違い」を教えてください!

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
子クラスのオブジェクトに、親クラスのオブジェクトを代入する方法が分からなくて困っています><。
ソースコードで説明すると
class Car
{
}

class Bike:Car
{
}

Car oya = new Car();
Bike kodomo = new Car();

kodomo = oya;//これはエラーになる

というかんじです。
これが代入できるような方法はないでしょうか?
かなり抽象的な質問ですが、よろしければ御回答をお願いします。

A 回答 (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);
    • good
    • 0
この回答へのお礼

はう><一応、MemberwiseClone関数を使おうと思っていました。
すいません説明不足でした。

やはり一つ一つメンバを代入したほうがいいのですね。

なるほど・・インスタンスで代入をつかえばいいんですね!

みなさん、たくさんのご回答ありがとうございました。
おかげさまで解決できました。

お礼日時:2008/06/20 14:34

他の方がお書きのように、「子クラスの"変数"に、親クラスのオブジェクトの代入」は出来ません。



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

ただ、いずれにせよ、設計が悪いです。

この回答への補足

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

補足日時:2008/06/19 00:55
    • good
    • 1

#2さんもおっしゃっていますが、


そのようなコードが必要だという場合、設計がまずいのでやり直したほうがいいです。

また継承やポリモフィズムについて、もう少し勉強しないと、ですね。

この回答への補足

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

補足日時:2008/06/19 00:51
    • good
    • 0

継承ですよね?



それはバグの元だからやったらダメです。

親のメソッドは親に書いてください。

この回答への補足

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

補足日時:2008/06/19 00:50
    • good
    • 0

逆は可能ですが、それは無理じゃないかな。


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();
ほんとすいません><

補足日時:2008/06/19 00:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報