2011-02-26 21 views
-3

は、ここで私が解決したい私の宿題の質問です:継承関係についての概念的な質問?

R-2.9は、運動R-2.5から クラスの継承を考えてみましょう、とdはタイプの馬のオブジェクト変数で てみましょう。 dが 騎手型の実際のオブジェクトを参照している場合は、 クラスのレーサーにキャストできますか?なぜ、なぜそうではないのですか?ここ

運動R-2.5:

R-2.5は、クラスの次のセットのためのクラス継承図 を描く:

•クラスヤギは、オブジェクトを拡張し、インスタンス変数の尾を追加 メソッドmilk()およびjump()です。

•クラスPigはオブジェクトを拡張し、eat変数とwallow()メソッドのインスタンス変数noseと メソッドを追加します。

•Class HorseはObjectを拡張し、インスタンス変数heightと の色とメソッドrun()とjump()を追加します。

•Class RacerはHorseを拡張し、race()メソッドを追加します。

•クラス乗馬はホースを拡張し、インスタンス変数 の重みとメソッドtrot()と isTrained()を追加します。

+4

質問宿題にフラグを付けていただきありがとうございます。宿題の質問についてのメタ記事を読んでみたいと思うでしょう:[質問と答えの宿題 - 質問](http://meta.stackexchange.com/questions/10811/how-to-ask - と答え宿題 - 質問)。最初のポイントは重要です:まず、問題を解決するための誠実な試みを示してください。 –

+0

申し訳ありません。まあ、私はちょうど質問を理解したい、それは好きですか?馬術d =新しい馬(); Racer r =新しいRacer(); r = d;それはこれのようなものですか? –

+1

私はこれを 'Horse h = new Equestrian();と解釈します。レーサーr =(レーサー)h; ' –

答えて

4

「馬乗りはレーサーにキャストできますか?」問題の一部:記述されたクラスを実際に実装し、そのようなキャストを実行するコードを記述してみてください。それはコンパイルされますか?もしそうなら、実行時に例外をスローしますか?

"なぜですか?"パートB:クラスBがクラスAを拡張する場合、これはBもAであることを意味します。これはJavaがこれらのクラスの表現や使用方法について知っている唯一のものです - JavaはすべてのRacerがHorseであり、すべての騎馬隊は馬でもあります(そして、私たちがクラスを宣言したときにそう言っていたので、Javaはこれを知っています)。この情報だけに基づいて、Javaはあなたが騎馬(すべての馬ができること、馬に乗るなどの騎馬特有のものを行うことができる)を取ることを許可し、それがレーサーのように扱い始めることは合理的ですか? (それはまた、馬ができることすべてを行うことができますが、必ずしもトロットすることはできませんし、馬主が行うことができないいくつかのことを行うことができます)?

また、コンパイラが許可するものと実際に試行されるものとの間にはどのような違いがあることに注意してください。一般に、コンパイラは、かもしれないが成功するキャストを許可します。これらのコードセグメントのそれぞれを試してください。それぞれは異なる結果を与えるべきです(一つはコンパイルされません。一つはコンパイルされますが、実行されると例外がスローされますが、例外なくコンパイルされて実行されます)。次に、Javaがこのように動作するように設計されている理由を考えてみましょう。ツリーとしてこの

// Code segment A 
Horse h = new Equestrian(); 
Goat g = (Goat)h; 

// Code segment B 
Horse h = new Equestrian(); 
Racer r = (Racer)h; 

// Code segment C 
Horse h = new Racer(); 
Racer r = (Racer)h; 
+0

優れた答え! – user183037

0

思う:

馬 - >馬術

馬 - >レーサー

馬術とレーサーは、トランク馬の二つの枝です。

継承は上から下へ(トランクからブランチまで)のみ機能します。親クラスのメソッドと変数は、サブクラスによって継承できます。したがって、EquestrianはHorseクラスのメソッドと変数を継承します。 Racerは、Horseクラスのメソッドと変数も継承します。しかし、RacerやEquestrianクラスのオブジェクトはお互いのメソッドや変数を継承しません。

上記は、回答を把握するのに十分な情報である必要があります。宿題を終えたら、here'sより詳しい情報を見つけることができます。このような基本的なコンセプトについては、できるだけ早く読むことが非常に重要です。

関連する問題