2009-11-04 59 views
2

我學會了所有這些編程術語在瑞典,所以請多多包涵..的Java多態性問題

我有調用子類中的方法,該方法應該重寫超類中的方法問題。

這裏是階級結構與刪除代碼:

public interface Movable { 
    public void move(double delta); 
} 
public abstract class Unit implements Movable, Viewable{ 
    public void move(double delta){ 
      System.out.println("1"); 
    } 

} 
public class Alien extends Unit{ 
    public void move(long delta){ 
     System.out.println("2"); 
    } 
} 
public class Player extends Unit{ 
    public void move(long delta){ 
     System.out.println("3"); 
    } 
} 

public void main(){ 
    ArrayList<Unit> units = new ArrayList<Unit>(); 
    Unit player = new Player(); 
    Unit alien = new Alien(); 
    units.add(player); 
    units.add(alien); 
    for (int i = 0; i < this.units.size(); i++) { 
     Unit u = (Unit) this.units.get(i); 
     u.move(); 
    } 
} 

這將輸出1和1,但我希望它輸出2和3
我在做什麼錯?我認爲這是它的工作原理。

回答

12
public class Alien extends Unit{ 
    public void move(long delta){ 
     System.out.println("2"); 
    } 
} 
public class Player extends Unit{ 
    public void move(long delta){ 
     System.out.println("3"); 
    } 
} 

這是你的問題,在界面中,你有招聲明:

public void move(double delta) 

但是你的子類聲明:

public void move(long delta) 

,創建一個新的功能,從移動獨立並不會覆蓋它。要修復它改變外國人的和玩家的移動功能:

public void move(double delta) 

而且,奧特洛程序員所指出的,你可以通過添加@Override註解權利的任何函數的聲明上面有編譯器捕獲這種錯誤的你打算覆蓋父類中的函數。像這樣:

public class Alien extends Unit { 
    @Override 
    public void move(double delta) { 
     System.out.println("2"); 
    } 
} 
+0

Doh>。<謝謝! :) – Baversjo 2009-11-04 17:56:06

2

您需要將@Override標誌添加到外星人和玩家類中的移動功能。

,將已經幫助您發現您還沒有完全覆蓋你的舉動,因爲外來/播放器的類型很長,沒有雙打

+0

該註釋沒有任何魔術屬性;它只是告訴編譯器你的意圖。即使不包含註釋,覆蓋方法也應該可以工作。 – 2009-11-04 17:53:57

+0

在這種情況下,它會幫助他發現他的問題,而不是雙倍 – 2009-11-04 17:56:27

+0

是的,但是你的答案(「你需要...」)的方式使你看起來似乎只是添加該關鍵字將以某種方式觸發多態呼叫的工作。 – 2009-11-04 19:41:24

12

你的子類(外國人和播放器)不重寫移動()方法在他們的父類中,因爲你已經將delta聲明爲long而不是double。

通過使用@Override註釋,您可以讓編譯器發現其中的一些錯誤。

+1

@Override的+1。 – 2009-11-04 18:01:40

+0

*秒@ +1覆蓋* – 2009-11-04 18:04:23

2

你的孩子上課不實現相同的方法簽名:

public void move(double delta); 

是不一樣的:

public void move(long delta); 

爲了趕上這種錯誤在編譯時,您可以在方法簽名中添加@Override。編譯器將檢查子類是否確實重寫父類中的方法。