2014-03-12 34 views
1

所以說你想要一個叫做play的抽象類,它有一個渲染方法。抽象渲染方法如何工作? (Java)

public abstract class RenderPanel{ 

    public abstract void render(); 

} 

然後你有另一個類,使用某種遊戲循環來調用渲染方法。

public class Window implements Runnable{ 

public void run(){ 

    while(running){ 
     RenderPanel.render(); 
     Thread.sleep(5000); 
    } 
} 

} 

此代碼不起作用,因爲您無法靜態調用抽象類,也無法實例化類。

那麼你會如何去這個問題,這樣如果你讓RenderPanel的子類,呈現在子類中的方法將被自動調用?

+0

@martynas但是如何調用構造函數?據我所知,你不能調用抽象類的構造函數,只能調用它的子類的構造函數 – FidgetyTheGamer

回答

2

Java保留運行時類型信息(RTTI)。這意味着即使您持有對基類對象的引用,子類的方法也會被調用(如果方法被子類覆蓋)。所以你不必做任何事情,所以作爲子類方法被調用。

public class SubRenderPanel extends RenderPanel{ 
    @Override 
    public abstract void render() 
    { 
     //Do your stuff here 
    } 
} 

public class Window implements Runnable{ 
    RenderPanel r = new SubRenderPanel(); 
    public void run(){ 
     while(running){ 

      r.render(); 
      Thread.sleep(5000); 
     } 
    } 
} 
0

的想法是創建一個擴展RenderPanel一個新的類,並使用一個:

public class SubRender extends RenderPanel{ 
     @Override 
     public abstract void render() 
     { 
      //Do your stuff here 
     } 

} 

然後你想創建SubRender的實例,並把它作爲RenderPanel:

public class Window implements Runnable{ 

public void run(){ 

    while(running){ 
     //The subRender will act as a RenderPanel, so class specific functions will be hidden. Is just like using an java interface. 
     RenderPanel r = new SubRender(); 
     r.render(); 
     Thread.sleep(5000); 
    } 
} 

} 

你現在所擁有的基本上是一個作爲接口的抽象類。我建議你改用一個接口。抽象類最常用於爲對象的「類型」提供常見行爲,在您的情況下,您希望具有「類型」的渲染。

但是,這種共同的行爲缺少,所以我會用一個接口來代替。

研究一些可通過互聯網獲得的Java教程。 這是一個非常基本的java問題。搜索關於Java接口的子類(多態)。