抽象クラスBirdを作成するプログラムを作成しています。このクラスには "チャープ"を出力するchirp()というメソッドがあります。 Birdから拡張されたGooseとMallardという2つの追加クラスを作成しました。これは異なる音を出力するチャープメソッドをオーバーライドしています: "Honk" & "Quack"。私がBirdから継承するCrowと呼ばれる別のクラスを追加する場合、どのようにオーバーライドしないメソッドチャープを書くのでしょうか?抽象クラスと抽象メソッド
私のアプローチは、異なるメソッドシグネチャでメソッドチャープを作成することです。私はこれをしたと思うが、私がそれを望むように編集していない。私はここで
がコードです...鳥私はカラスクラスに作成する必要がありますどのような変更抽象のメソッドを作成した場合また、私がこれまで持っている:
import java.util.Scanner;
public abstract class Bird {
public void chirp() {
System.out.println("chirp");
}
//if chirp made abstract
public abstract void chirp();
}
public class Goose extends Bird {
public void chirp() {
System.out.println("Honk");
}
}
public class Mallard extends Bird {
public void chirp() {
System.out.println("Quack");
}
}
public class Crow extends Bird {
String sound;
public void chirp(String x) {
sound = x;
}
}
public class Problem10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Demonstration of polymorphism
Bird goose = new Goose();
Bird mallard = new Mallard();
goose.chirp();
mallard.chirp();
//Reference Variable
Bird bird = null;
//Prompt the user to enter a number that is either 1 or 2
Scanner scanner = new Scanner(System.in);
System.out.println("Input number either 1 or 2: ");
int inputInt = scanner.nextInt();
if (inputInt == 1) {
bird = new Goose();
}
else if (inputInt == 2) {
bird = new Mallard();
}
else if (inputInt == 3) {
bird = new Crow();
bird.chirp("Crow");
}
bird.chirp();
}
}
'Crow#chrip(String)'は、 'Crow#chirp'が' Bird#chirp'に存在しないパラメータを追加したため、 'Bird#chip()'をオーバーライドしません。パラメータを削除するか、デザインを再考する必要があります –
コンパイルするとどうなりますか?エラーメッセージとは何ですか?あなたはそれについて何を理解していませんか?可変鳥のタイプはどれですか?その型を考えると、コンパイラはその変数によって参照されるオブジェクトにメソッドchirp(String)があることをどのように知ることができますか? –
@Surace:いいえ、抽象クラスに抽象メソッドを持たせる必要はありません。上記の例の抽象メソッドをコメントアウトすると、* fine *がコンパイルされることがわかります。 – Makoto