我有一节课,让我们说
public class GeneralClass<T> {
methodA() {...}
methodB() {...}
methodC() {...}
}
我来自这个班级
public class MoreSpecificClassString extends GeneralClass<String> {
methodD() {...}
methodE() {...}
methodF() {...}
}
public class MoreSpecificClassInt extends GeneralClass<Integer> {
methodX() {...}
methodY() {...}
methodZ() {...}
}
现在,我想知道是否可以强制GeneralClass的子类只覆盖一个方法,例如methodA
?
由于
答案 0 :(得分:5)
是。使methodA
抽象化并使GeneralClass
成为抽象类。如果您要禁止覆盖methodB
和methodC
,请将其标记为final
。
另一方面,如果您希望能够提供methodA
的默认实现,并且也要求子类覆盖它,那么您实际上违反了Liskov Substitution Principle 。你需要重新评估你需要这个设计的原因,因为它闻起来很糟糕。例如,绝对 nothing 会阻止您的子类像这样覆盖您的方法:
@Override
public void methodA() {
super.methodA();
}
如果重新实现只能调用超类的默认实现,那么强制它首先被覆盖的重点是什么?
由于这个原因(其中包括),不可能提供默认实现和要求子类覆盖它。重新思考你的设计。
答案 1 :(得分:3)
是的,将GeneralClass
作为一个抽象类,并使用其他方法的实现。
示例:
abstract class ABC {
abstract int methodA();
final int methodB() { ... implementation ...}
}
答案 2 :(得分:0)
只强制一个 - 制作此方法abstract
?
答案 3 :(得分:0)
您可以使用多种工具:
abstract
。将强制具体类实现该方法。final
。派生类不能覆盖这些方法。