@MustOverride注释?
2022-09-02 23:13:50
在 .NET 中,可以为特定超类中的方法指定“mustoverride”属性,以确保子类重写该特定方法。我想知道是否有人有一个自定义的java注释可以达到同样的效果。从本质上讲,我想要的是推动子类来覆盖超类中的方法,该方法本身具有一些必须运行的逻辑。我不想使用抽象方法或接口,因为我希望在超级方法中运行一些通用功能,但或多或少会产生编译器警告/错误,表示派生类应该覆盖给定的方法。
在 .NET 中,可以为特定超类中的方法指定“mustoverride”属性,以确保子类重写该特定方法。我想知道是否有人有一个自定义的java注释可以达到同样的效果。从本质上讲,我想要的是推动子类来覆盖超类中的方法,该方法本身具有一些必须运行的逻辑。我不想使用抽象方法或接口,因为我希望在超级方法中运行一些通用功能,但或多或少会产生编译器警告/错误,表示派生类应该覆盖给定的方法。
我不太明白为什么你不想使用抽象修饰符 - 这是为了强制子类实现,只需要用于某些方法,而不是全部。或者也许你正在考虑C++风格的“纯抽象”类?
但是许多Java开发人员没有意识到的另一件事是,也可以重写非抽象方法并将它们声明为抽象方法;喜欢:
public abstract String toString(); // force re-definition
因此,即使已经定义了实现,也可以强制子类再次定义它。java.lang.Object
忽略抽象方法,Java中没有这样的工具。也许可以创建一个编译时注释来强制该行为(我不相信它是),但仅此而已。
真正的踢球者是“覆盖超类中的方法,该方法本身具有必须运行的一些逻辑”。如果重写某个方法,则不会调用超类的方法,除非显式调用它。
在这种情况下,我倾向于做这样的事情:
abstract public class Worker implements Runnable {
@Override
public final void run() {
beforeWork();
doWork();
afterWork();
}
protected void beforeWork() { }
protected void afterWork() { }
abstract protected void doWork();
}
以在接口的方法上强制使用特定的逻辑结构。例如,您可以使用它来计算调用次数,而不必担心用户是否调用等。super.run()