【问题标题】:Java - Call method on a subclass (Process 'user code' before finishing method)?Java - 在子类上调用方法(在完成方法之前处理“用户代码”)?
【发布时间】:2016-05-20 19:46:03
【问题描述】:

我有一个名为 GameEngine 的基类,它应该是我的“游戏引擎”的“核心”。它完成所有的图形处理和物理滴答。但是,我不想将游戏的实际源代码放在此类中。所以这基本上就是我所拥有的:

//GameEngine
void start() {
    //While loop to call render() and tick()
}
void render() {
    //BufferStrategy, etc.
    //[[[[HERE]]]] Call method on subclass
    //dispose() and show()
}
void tick() { }

还有……

//SampleGame
public class SampleGame extends GameEngine {
    public static void main(String[] args) {
        new GameEngine().start();
    }
    public void render() {
        //This gets called before dispose() and show()
    }

}

那么,我怎样才能让超类在子类中调用 render() 方法呢?我无法覆盖超类方法,因为它需要在调用子类的 render() 方法之前和之后做一些工作。

谢谢

【问题讨论】:

  • 为什么它是一个子类?两者是否还有其他代码共享很多?如果不在超类中创建它的实例,您将无法调用子类的方法。
  • 您对OOP、继承和类的基本了解似乎欠缺。你应该可能学习
  • 我最初想写一个答案,但这个 Wiki 链接完美地回答了你的问题:en.wikipedia.org/wiki/Template_method_pattern#Example_in_Java
  • 谢谢,@Amit,我可能应该,但是,我对 Java 的需求并不大,因为几年后 applet 就会消亡。它仍然会有所帮助。我对其他语言的继承有很好的理解,但这个问题只是一个奇怪的案例。感谢您的关心
  • 好的,很抱歉“误读”了您的知识

标签: java inheritance subclass superclass super


【解决方案1】:

在超类中将render() 声明为abstract 方法,它会在适当的位置调用该方法。然后,子类通过用具体实现覆盖该方法来定义该方法的行为。

【讨论】:

    【解决方案2】:

    我会使用“插槽方法设计模式”。简而言之,您有一个算法的最终步骤序列,但需要允许在特定步骤对其进行参数化。这些特定步骤是调用“插槽方法”的地方。 通常,槽方法是以 doXXX() 为前缀的受保护(抽象)方法。

    例子:

    //GameEngine
    void start() {
        //While loop to call render() and tick()
    }
    void render() {
        //BufferStrategy, etc.
        doCallUserCode();
        //dispose() and show()
    }
    void tick() { }
    protected abstract doCallUserCode();
    

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多