
開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
子クラスのオブジェクトに、親クラスのオブジェクトを代入する方法が分からなくて困っています><。
ソースコードで説明すると
class Car
{
}
class Bike:Car
{
}
Car oya = new Car();
Bike kodomo = new Car();
kodomo = oya;//これはエラーになる
というかんじです。
これが代入できるような方法はないでしょうか?
かなり抽象的な質問ですが、よろしければ御回答をお願いします。
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);
はう><一応、MemberwiseClone関数を使おうと思っていました。
すいません説明不足でした。
やはり一つ一つメンバを代入したほうがいいのですね。
なるほど・・インスタンスで代入をつかえばいいんですね!
みなさん、たくさんのご回答ありがとうございました。
おかげさまで解決できました。
No.4
- 回答日時:
他の方がお書きのように、「子クラスの"変数"に、親クラスのオブジェクトの代入」は出来ません。
ただ、「子クラスのオブジェクトに・・・」とお書きと言うことは、実は代入じゃなくて、オブジェクトからオブジェクトへのメンバのコピーがしたいのではないでしょうか。C#はよく知りませんが、メンバーを個別にコピーすればいいかと。
ただ、いずれにせよ、設計が悪いです。
この回答への補足
そうなんです><メンバをコピーしたいんです。
>>メンバーを個別にコピーすればいいかと
それが結構メンバが多くてひとつひとつ書いていくと結構な数になってしまいそうで・・・。
>>ただ、いずれにせよ、設計が悪いです
やはりそうなんですか・・・。
しかし、代入しないようにするやり方が思いつけない><
もしかして、親クラスはオブジェクトをあまり作らずに、できるだけ子クラスで作ったほうがいいんでしょうか?
No.3
- 回答日時:
#2さんもおっしゃっていますが、
そのようなコードが必要だという場合、設計がまずいのでやり直したほうがいいです。
また継承やポリモフィズムについて、もう少し勉強しないと、ですね。
この回答への補足
ソースコード間違ってました><
またこれとは別に、親クラスのオブジェクトを子クラスのオブジェクトに入れなければいけない状態って避けるべきでしょうか?
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;
この回答への補足
・・・は!しまった><
すいません、コード書き間違えてました><
Bike kodomo = new Bike();
ほんとすいません><
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 私の車は、購入してから7年目になるが、これまでに車検を3回受けた。の英訳 11 2022/06/13 03:39
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- Java java final 1 2022/06/10 22:49
- 英語 英語5文型の分け方についてです The national business travel assoc 3 2022/12/03 19:51
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- PHP クラス 1 2022/08/08 15:12
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- 英語 英語ー単数形?複数形? 12 2022/10/03 18:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Objective-c 画像処理
-
delete演算子によるメモリ解放...
-
警告が消えません・・・
-
インスタンスオブジェクトとは...
-
C#でのコンパイル時のエラー
-
CreateObjectとはどういう意味...
-
関数で値渡しと参照渡しではど...
-
デザイナ時のエラー「オブジェ...
-
メモリ解放について、ご教授く...
-
FriendとPublicの違い。。。
-
VBA チェックボックスをオーバ...
-
エディットコントロールのイベ...
-
イベントにAddHandlerされてい...
-
VB.NETでクラスライブラリプロ...
-
エディットコントロールでEnter...
-
DataGridViewのセルに斜線を引...
-
excel vba グラフ データラベル...
-
ウィンドウの背景に画像を配置する
-
ダイアログクラスのコントロー...
-
継承したポインタ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
C# panel内のコントロールの使...
-
delete演算子によるメモリ解放...
-
CreateObjectとはどういう意味...
-
関数で値渡しと参照渡しではど...
-
ボタンを押すとラベルの文字を...
-
オブジェクトをどこでdisposeす...
-
クラス内にWin32APIのコールバ...
-
コンストラクタ内でのthisポインタ
-
【VC++6.0(MFC)】「Out of memo...
-
C#でのUNZIP32.DLLの利用方法が...
-
SetとNothingの存在意味?
-
一時オブジェクト?の生存期間
-
「R = ActiveCell」がエラーに...
-
最小化したフォームを元に戻す
-
DataGridViewがクラッシュする
-
クラス?オブジェクト?インス...
-
メモリ解放について、ご教授く...
-
メモリリークが発生するのはど...
-
UMLでの「オブジェクト」と「イ...
おすすめ情報