如果我不想让我的班级上的某个方法被调用,我只是将其设为私有。
但是如果我想允许覆盖该方法,我必须使其受保护
是否可以在抽象类上设置一个无法调用但可以覆盖的方法? (我猜不是,但有没有解决办法?)
用例:
abstract class Super {
protected void finalize() {
}
public final void doThings() {
// do stuff
finalize();
}
}
以及想要扩展课程的人:
class Sub extends Super {
@Override
protected void finalize() {
closeSockets();
alertSomeone();
}
}
但我不希望其他课程调用mySub.finalize()
;
答案 0 :(得分:2)
子类可以为超类提供包含要执行的代码的Runnable,而不是覆盖方法。你可以这样做:
public class Super {
private final Runnable subClassCode;
public Super(Runnable finalizeCode) {
subClassCode = finalizeCode;
}
public final void doThings() {
// do stuff
subClassCode.run();
}
}
public class Sub extends Super {
public Sub() {
super(() -> {
// code to be executed in doThings()
});
}
}
您不需要在构造函数中设置Runnable实例。您也可以访问受保护的setFinalizeCode(Runnable)方法,但该方法也可以由与Super相同的包中的其他类调用。