繁体   English   中英

java - 如何在java中的抽象函数之前添加要运行的代码?

[英]How can I add code to run before an abstract function in java?

如何更改以下代码以便我不需要占位符 oTick()? (tick() 方法是从 GameObject 继承的,我正在尝试将它实现到从此类扩展的类中)

import java.awt.*;

public abstract class Obj extends GameObject {

    public Obj(int x, int y) {
        super(x, y);
    }

    @Override
    public void tick() {
        y--;

        oTick();
    }

    public abstract void oTick();

    @Override
    public abstract void render(Graphics g);

    @Override
    public abstract Rectangle getBounds();
}

不确定我是否理解您的问题,但您可以执行以下操作:

public abstract class Obj extends GameObject {

    public Obj(int x, int y) {
        super(x, y);
    }

    @Override
    public final void tick() {
        beforeOTick();
        oTick();
    }

    protected abstract void beforeOTick();

    protected abstract void oTick();

    @Override
    public abstract void render(String g);

    @Override
    public abstract String getBounds();
}

您将tick()设为 final,以便它不能被子类覆盖,并添加protected abstract void beforeOTick(); 这也应该在子类中实现。 子类的一个例子可能是:

public class SubclassObj extends Obj {
    public SubclassObj(int x, int y) {
        super(x, y);
    }

    @Override
    protected void beforeOTick() { }

    @Override
    protected void oTick() { }

    @Override
    public void render(String g) { }

    @Override
    public String getBounds() { }
}

让我们看看这里是怎么回事。

public final void tick() {
    y--;

    oTick();
}

protected abstract void oTick();
  • [Service] 方法tick是该类提供的公共API服务 它可能是final
  • 【需求】 oTick方法是孩子们必须实现的需求,自己提供。 因此它可以得到protected

一般来说, oTick可以被赋予一个参数:

public final void tick() {
    y--;
    Context ctxt = ...;
    oTick(ctxt);
}

protected abstract void oTick(Context ctxt);

结论是,大多数情况下这是一个足够小的代码模式。


有时,当覆盖/抽象方法是大多数孩子使用的时候,您可以使用带有 lambda 的构造函数来代替:

public abstract class Obj extends GameObject {

    private final Runnable oTick;

    public Obj(int x, int y, Runnable oTick) {
        super(x, y);
        this.oTick = oTick;
    }

    @Override
    public void tick() {
        y--;
        oTick.run();
    }
}
...
Obj obj = new Obj(0, 0, () -> System.println("Help!"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM