次の問題があります。多相呼び出しを作成しようとしていますが、その結果は基底クラスに応じて値を変更する変数に依存します。しかし、それは動作しません別のものを試してみました。何が変わるべきか教えてください。多型呼び出しは変数に依存する
class Cycle{
private int w = 0;
public void move(){
System.out.println("Cycle moving");
}
public int wheels(Cycle c){
switch (c.w){
case 1: return 1;
case 2: return 2;
case 3: return 3;
default: return 0;
}
}
}
class Unicycle extends Cycle{
public int w = 1;
public void go(){
System.out.println("Unicycle go");
}
}
class Bicycle extends Cycle{
public int w = 2;
public void go(){
System.out.println("Bicycle go");
}
}
class Tricycle extends Cycle{
public int w = 3;
public void go(){
System.out.println("Tricycle go");
}
}
public class TestCycle {
public static void ride(Cycle c){
c.move();
int now = c.wheels(c);
System.out.println(now);
}
public static void main(String[] args){
Bicycle b = new Bicycle();
ride(b);
Unicycle u = new Unicycle();
ride(u);
Tricycle t = new Tricycle();
ride(t);
}
}
あなたのコードには本当に悪いことがあります:サブクラスで 'int w'を再宣言します。変数をシャドーイング(または隠す)と呼ばれています。私はなぜ言語のデザイナーがそれを許したのか理解していない。 – toto2
また、あなたの3つのサブクラスに 'go'メソッドがあることは奇妙に見えます。彼らは 'go'メソッドを持つ何かのサブクラスでなければなりません。 – toto2
@ toto2 'Cycle.w'はプライベートなので、それは働きます。それは継承者からは理解できません。したがって、シャドーイングはありません。 – Viruzzo