多态调用取决于变量

时间:2012-01-13 14:45:53

标签: java polymorphism

我有以下问题。我试图进行多态调用,结果将取决于根据底层类改变值的变量。试过不同的东西然而它不起作用。请让我知道应该改变什么。问题是虽然c.w读取局部变量w,默认为0并从适当的类中读取它,但它总是默认为0.以下是代码:

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);
    }

}

4 个答案:

答案 0 :(得分:2)

你的问题(其中之一)就是你要在每个子类中重新定义类变量'w'。将其定义为“循环”的成员,并让每个子类在其构造函数中正确设置它。

class Cycle{
    protected int w;
    public void move(){
        System.out.println("Cycle moving");
    }
    public int wheels(){
        return w;
    }
}

class Unicycle extends Cycle{
    public Unicycle() {
        w = 1;
    }
     public void go(){
        System.out.println("Unicycle go");
    }
}

或者您可以在超类中定义一个名为'wheels()'的抽象方法,并在子类中覆盖它。这是一个品味问题。

答案 1 :(得分:1)

轮子方法应该更像

public int getWheelCount(){
   return this.w;
}

您在实例本身上调用它,您不需要传递参数。如果当前实例是三轮车,则该方法将返回3,等等......

答案 2 :(得分:1)

这可能不是您正在寻找的答案,但以下工作。请详细说明您的目标。

public abstract class Cycle {
   protected int nWheels;
   protected String goText;

   // no constructor.

   public void go() {
     System.out.println(goText);
   }

   public int wheels() {
     return nWheels;
  }
}
...

public class Unicycle extends Cycle {

   public Unicycle() {
      nWheels = 1;
      goText = "Unicycle go";
   }
}

请注意,我制作了Cycle abstract,因为我不希望它被实例化。

修改

public static int getNumberOfWheels(Cycle cycle) {
   return cycle.wheels();
}

这显然不是很有用,因为对cycle.wheels()的简单调用与调用此函数的方式相同。

我不确定你为什么要避免构造函数。也许你应该写下你想要回答的确切问题。

答案 3 :(得分:1)

由于Cycle.w是私有的,因此从其继承者看不到它。这意味着例如Tricycle.w它不是“相同”变量,并且它在循环中不可见(这就是为什么你总是得到0)。你必须使Cycle.w至少受到保护,然后从所有子类中删除w,并在每个子类的构造函数中将其值设置为你想要的值。