强制我的类的子类只覆盖Java中的某些函数

时间:2011-11-14 21:42:59

标签: java class generics methods override

我有一节课,让我们说

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

由于

4 个答案:

答案 0 :(得分:5)

是。使methodA抽象化并使GeneralClass成为抽象类。如果您要禁止覆盖methodBmethodC,请将其标记为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)

您可以使用多种工具:

  1. 您可以声明方法(和基类)abstract。将强制具体类实现该方法。
  2. 声明不可重写的方法final。派生类不能覆盖这些方法。
  3. 结合1&amp; 2:声明一个方法final并让它将其部分工作委托给一个抽象方法。 (这种模式通常与空方法而不是抽象方法一起使用,以实现所谓的“钩子”到其他固定逻辑中。)
相关问题