2012-01-17 26 views
2

私はAを拡張し、Aを拡張するクラスBを持ち、サブクラスです。今私が持っている継承と多相 - 理解

A aObject = new A(); and 
A bObject = new B(); 

私はタイプキャスティングなしでbObjectを使用してAではないクラスBのメソッドを呼び出すことができますか?

型キャストなしでそうすることができない場合は、多型の利点は何ですか?

ありがとうございました。

+0

どのような状況を言うことができますあなたはA経由で参照を保持していても、B固有のメソッド?あなただけのことを学ぼうとしているのですか、何らかの理由で本当にその機能が必要ですか? –

答えて

2

いいえ、できません。オブジェクトaObjectbObjectの両方で、キャストを使用しないでAに定義されているメソッドだけを呼び出すことができます。

bObjectをタイプBと定義した場合は可能ですが、あなたのコードが示すように、Aのメソッドとメンバーでしか動作しません。

+0

@Anthony Pegramありがとう。そのような場合、多型の利点は何ですか? – nik7

+0

@ynwa、コメントは、多型の利点について話すには十分なスペースではありません。しかし、一般的に言えば、(APIを介して)スーパークラスに定義されている機能については、その動作をサブクラスでさらに特化したり上書きしたりすることができます。 APIへの追加はそれを超えています。簡単な例。動物は騒音を発する。しかし、猫は鳴きます。犬の樹皮。動物のスーパークラスで 'void speak()'を定義している場合は、サブクラスで特定の正しい動作を作成できます。 –

+0

私の理解から、スーパークラスメソッドがサブクラスによってオーバーライドされた場合、メソッド呼び出しはオブジェクトに存在するインスタンスに基づいて行われますか? Aがspeak()メソッドを持ち、Bがoverwrites()を呼び出すのと似ています。 A bObject =新しいB(); bObject.speak()はオーバーライドされたメソッドを呼び出し、a aObject = new A(); aObject.speak()はAのメソッドを呼び出します。 – nik7

2

いいえ、aObjectとbObjectの両方がタイプAになりました。

3

いいえ、あなたは間違いなく限りコンパイラが懸念しているとして、bObjectではなく、コンストラクタを使用しての、あなたが戻っていたことを想像して宣言したクラスAであり、これはB.

にbObjectをキャストする必要がありますクラスAを返す関数からのbObject .....どのようにしてコンパイラは実際にクラスBであるかを知ることができましたか?

そのためランタイムキャストを行うか、instanceofは、コンパイラは[いいえ、することはできませんクラスB

+1

'instanceof'チェックの後でさえ、あなたが' B'のメンバーの1つにアクセスしたい場合は、キャストを行う必要があります。 –

+0

型キャスティングは唯一の方法ですか?それは良いプログラミングの練習ですか? – nik7

2

としてそれを使用できるようになる前にチェックする必要があります。あなたが行うには喜んでいた場合は、キャストを回避するための唯一の方法は次のとおりです。

オブジェクト(変数宣言の左にあるタイプ)の 宣言された型は、メソッドを呼び出すことができるかを決定するためだ
B bObject = new B(); 

、タイプがAであると書いた場合は、キャストを行わない限りAのメソッドしか呼び出せません。

1

私はあなたがポリモーフィズムを理解するように学ぶために使用された例を使用します:

あなたは、いくつかの動物からなるゲームを作成しているが。この動物の一つの重要な側面は、彼らがどのように動くかである。 は、あなたは、クラス定義:

class Animal{ 
void move(){} 
} 

をしかし、カエルや哺乳類は、それらを同じように移動するのですか?彼らはしません。繰り返しますが、作成されている動物の種類がランダムに行われているので、現在どの動物が操作されているかを知る立場にはありません(ゲームの利益のために推測されます)。あなたが持っているものは動物への参照です、あなたはタイプはい(反射)を得ることができますが、なぜハッスル? したがって、可能なすべてのタイプの動物の動物クラスをサブクラス化し、その移動動作をオーバーライドします。

class Frog extends Animal{ 
void move(){ hop();} 
} 

class Snake extends Animal{ 
void move(){crawl();} 
} 

今あなたがランダムに動物の種類を作成するどこかの動物のマネージャーを持っている:

今、あなたはあなた自身が起動する必要が見つかりどこにある

Animal a = AnimalManager.createAnimal(); 
a.move(); //it may hop or crawl. it just does not matter how it does it. you dont care whether it is a Frog, a Snake, a Man. but it will move. now thats polymorphism!