開発環境は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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VC++6.0(MFC)】「Out of memo...
-
メモリリークが発生するのはど...
-
ボタンを押すとラベルの文字を...
-
最小化したフォームを元に戻す
-
C# panel内のコントロールの使...
-
関数で値渡しと参照渡しではど...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
excel vba グラフ データラベル...
-
(UWSC) 「#32770」の意味わかり...
-
VC++ Express m_hWnd
-
IncludeではなくClassで宣言す...
-
DebugクラスとTraceクラスの違い
-
DataGridViewのセルに斜線を引...
-
ユーザーフォームのVBAエラー
-
ダイアログ表示時にチェックボ...
-
windowプログラム ピクチャー...
-
VB.NETで、DLLを頂いたんですが...
-
正規表現 [^/]+ の意味を教えて
-
【ASP.NET】 独自で作成したク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
C# panel内のコントロールの使...
-
コンストラクタ内でのthisポインタ
-
関数で値渡しと参照渡しではど...
-
ボタンを押すとラベルの文字を...
-
クラス内にWin32APIのコールバ...
-
【VC++6.0(MFC)】「Out of memo...
-
オブジェクトをどこでdisposeす...
-
イベントドリブンとオブジェク...
-
最小化したフォームを元に戻す
-
Excel2003VBAからIE64bitを制御
-
delete演算子によるメモリ解放...
-
デザイナ時のエラー「オブジェ...
-
オブジェクト指向を理解できない。
-
SetとNothingの存在意味?
-
vectorに格納されたオブジェク...
-
プログラミング
-
VB6では、Applicationは未定義...
-
メモリリークが発生するのはど...
-
FriendとPublicの違い。。。
おすすめ情報