如果override方法没有显式调用它的super方法,我想抛出一个自定义异常。如果任何类扩展了类A并重写了say()方法,应该强制调用super.say()来执行用基类方法编写的代码,如果失败,我想抛出自定义异常,如超级异常
public void onLocationChanged(Location currentLocation)
{
Log.d(TAG, "Location Updated");
latitude = currentLocation.getLatitude();
longitude = currentLocation.getLongitude();
Cursor cursor = mDatabaseManager.getAllLocations();
// Do something
cursor.close();
}
答案 0 :(得分:0)
这是@DavidWallace建议的方法,这比你想要的更好,因为它使得子类不可能阻止say()
做什么它在基类中执行:
class A {
public final void say() {
System.out.println("From super");
saySomethingElse();
}
/**
* Subclasses can override this method to make the say() method
* say something else in addition to "From super".
*/
protected void saySomethingElse() {
}
}
class Demo extends A {
@Override
protected void saySomethingElse() {
System.out.println("From Child");
}
public static void main(String[] args) {
Demo d = new Demo();
d.say();
}
}
答案 1 :(得分:0)
使用普通Java在运行时无法可靠地执行此操作。覆盖方法时,新版本完全会覆盖旧版本。因此,当调用该方法时,控制转到子类版本而不是父类版本。无论是否调用超类方法,完全由最重要的方法决定。
执行您想要做的事情有三个主要选项
如果您具有覆盖此方法的子类的编译时访问权限,那么您可以使用静态分析工具(如Checkstyle或Findbugs)来确保该方法调用super()。例如,Findbugs已经有clone()
方法的规则。您可以为自己的方法实现类似的规则。
按照@DavidWallace的建议重新设计代码。您面临的根本问题是,您希望控制流到子类,同时您希望确保超类中发生某些事情。如果重新设计代码以使say()
方法在超类中是最终的,那么它可以在每个子类实现的超类(称为sayInternal
)上调用抽象方法。然后,您可以确定当用户调用say()
时,他们首先以超类方法结束,并且超类完全控制子类方法的使用方式。
您可以使用运行时代理在加载类时检查它们。这可以验证是否调用了超类方法并拒绝加载不调用它的类。