2017-08-21 10 views
2

多形性についてしか学習していないので、私は簡単に(本から文字通りコピーします)。メソッドに引数としてクラスを渡そうとします。私がそれをすると、スーパークラスのメソッドを呼び出すことはできますが、実際のサブクラスは呼び出すことはできません。 start()メソッドを使用して、私はオオカミの遠吠えを作ってみる:多型引数はスーパークラスでは動作しますが、サブクラスでは動作しません

public class experiment { 
    public static void main(String[] args) { 
     PetOwner own = new PetOwner(); 
     own.start(); 

    } 
} 

//Trying polymorphic arguments 
class Vet { 
    public void giveShot(Animal a) { 
     a.howl(); 
    } 
} 
class PetOwner { 
    public void start() { 
     Vet v = new Vet(); 
     Wolf w = new Wolf(); 

     v.giveShot(w); 
    } 
} 
//Inheritance// 
//Kingdom - Animal 
class Animal { 
    public void move() { 
     System.out.println("*motions softly*"); 
    } 
} 
//Family - canine 
class Canine extends Animal { 
    public void bark() { 
     System.out.println("Woof!"); 
    } 
} 
//Species - wolf 
class Wolf extends Canine { 
    public void howl() { 
     System.out.println("Howl! Howl!"); 
    } 
} 

私はスーパークラス(動物)にハウルメソッドを渡すと、それが正常に動作します。私がWolfクラスから直接呼び出すと、うまく動作します。私が狼クラスを引数として渡してそこから呼び出そうとすると、うまくいきません。私はそのようにそれを試して、なぜここ

は、ヘッドファーストのJava PGから187を引用し、次のとおりです。

獣医さんgiveShot()メソッドは、あなたがそれを与える任意の動物を取ることができます。引数としてオブジェクトあなたのように 限りは、それは 私が取得しています

に動作しますサブクラス動物のある「シンボルシンボルを見つけることができません:メソッドハウル()、タイプの動物の場所の変数を」エラー。

+0

右* 'おそらく、あなたはありませんでした継承されたメソッドを参照しようとしています – GhostCat

+0

@GhostCat私は、特にそれが主張している本から引用符を追加しました。 - VetのgiveShot()メソッドはあなたがそれを与えるAnimalを取ることができます。引数として渡されたオブジェクトがAnimalの*サブクラス*である限り、それは動作します –

答えて

2

あなたはa.howl()を呼び出していますが、aAnimalクラスのインスタンスです。 Animalはどのようにしてhowlにわかりません。唯一のWolfはありません。

react()というメソッドを定義して、Animalという特定のサブクラスに対してオーバーライドします。

+0

私の本の引用: VetのgiveShot()メソッドは、それを与えるすべてのAnimalを取ります。引数としてのオブジェクトがAnimalの*サブクラス*である限り、それは動作します –

+1

@BarAkivaあなたはオブジェクトとしてそれらを考える現実世界にあなたの概念を適用しようとする必要があります。人がいる場合は、人が話すことができることを知っているので、英語を話すことができます。しかし、人が特定の言語を話し始めることができることを知っていれば(あなたの方法は次の人が来るかどうかわかりません)、まったくアイデアはありません。問題は、すべて同じメソッドをオーバーライドするか、すべて同じメソッドを実装することで解決できます(これは継承に関するものではありません)。 –

+1

@BarAkivaを共通のクラスから呼び出すことができます。共通のクラスは、共通のクラスを継承する可能性のある特定のクラスについては何も知らないので、共通のメソッドだけを呼び出すことができます。彼らが持っている方法について。 –

0

あなたはgiveShot-Methodの中でhowl-Methodを呼び出しています。動物にはハウリング法はありません。

EDIT:giveShot-Methodの中で動物をオオカミに投げ込むと効果があります。

0

はい、あなたは何ができるのようなもの:メソッド名である必要があり、識別子の場合*:最初の答えから

class Vet { 
    public void giveShot(Animal a) { 
     a.makeNoise(); 
    } 
} 
class Animal { 
    public void move() { 
     System.out.println("*motions softly*"); 
    } 
    public void makeNoise() { 
    } 
} 
//Family - canine 
class Canine extends Animal { 
    @Override 
    public void makeNoise() { 
     System.out.println("Woof!"); 
    } 
} 
//Species - wolf 
class Wolf extends Canine { 
    @Override 
    public void makeNoise() { 
     System.out.println("Howl! Howl!"); 
    } 
} 
関連する問題