[英]How can I run a single function on the opening of a Java 8 stream, before any other intermediate methods?
[英]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();
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.