Har*_*2k5 13 java abstract-class overriding annotations interface
在.NET中,可以为特定超类中的方法指定"mustoverride"属性,以确保子类覆盖该特定方法.我想知道是否有人有一个可以达到相同效果的自定义java注释.基本上我想要的是推动子类覆盖超类中的方法,该超类本身具有一些必须贯穿的逻辑.我不想使用抽象方法或接口,因为我希望在super方法中运行一些常用功能,但或多或少产生编译器警告/错误,表示派生类应该覆盖给定方法.
Sta*_*Man 19
我不太明白为什么你不想使用abstract修饰符 - 这是用于强制子类实现,只需要用于某些方法,而不是所有方法.或许您正在考虑C++风格的"纯抽象"类?
但是许多Java开发人员不知道的另一件事是,它也可以覆盖非抽象方法并将它们声明为抽象方法; 喜欢:
public abstract String toString(); // force re-definition
Run Code Online (Sandbox Code Playgroud)
所以即使java.lang.Object已经定义了一个实现,你也可以强制子类再次定义它.
cle*_*tus 12
忽略抽象方法,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();
}
Run Code Online (Sandbox Code Playgroud)
通过接口的方法强制使用特定的逻辑结构.例如,您可以使用它来计算调用,而不必担心用户是否调用super.run()等.
...如果声明一个基类abstract不是一个选项,你总是可以抛出UnsupportedOperationException
class BaseClass {
void mustOverride() {
throw new UnsupportedOperationException("Must implement");
}
}
Run Code Online (Sandbox Code Playgroud)
但这当然不是编译时检查......