【问题标题】:How would an abstract render method work? (Java)抽象渲染方法如何工作? (爪哇)
【发布时间】:2014-04-17 10:54:08
【问题描述】:

假设你想要一个名为 play 的抽象类,它有一个渲染方法。

public abstract class RenderPanel{

    public abstract void render();

}

然后你有另一个类,它使用某种游戏循环调用渲染方法。

public class Window implements Runnable{

public void run(){

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

}

此代码不起作用,因为您无法静态调用抽象类,也无法实例化该类。

那么你会怎么做,如果你创建一个 RenderPanel 的子类,子类中的 render 方法会被自动调用?

【问题讨论】:

  • @martynas 但是如何调用构造函数呢?据我所知,不能调用抽象类的构造函数,只能调用其子类的构造函数

标签: java render subclass abstract game-loop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个想法是创建一个扩展 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);
        }
    }
    
    }
    

    您现在拥有的基本上是一个用作接口的抽象类。我建议您改用界面。抽象类最常用于为对象的“类型”提供通用行为,在您的情况下,您可能希望拥有渲染的“类型”。

    但是缺少常见的行为,所以我会改用接口。

    学习一些可通过 Internet 获得的 Java 教程。 这是一个非常基本的java问题。搜索 Java 接口、子类(多态)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2015-02-05
      • 1970-01-01
      • 2022-06-15
      • 2017-08-27
      相关资源
      最近更新 更多