我有一个这样的父类(super class):
public abstract class Foo {
//some method here
public void aMethod() {
//some code
}
}
和 2 个子类 BarOne
和 BarTwo
扩展了 Foo
类。
在BarOne
中,一切正常,但是在BarTwo
中,我想@Deprecated
aMethod()
准确地说:出于隐私原因,我的意思是隐藏它,而不是弃用它。有没有比重写方法更好的方法?
最佳答案
即使技术上可能,它在概念上也是错误的。因为它概念上违反了 Liskov 替换原则。
您知道,继承不仅仅是将 A extends B
放入您的源代码中。这个想法是你的基类中的方法定义了一个契约。使用这些方法的代码不需要关心这样的方法是在基类中实现的,还是在子类中被重写的。
您基本上是在说:我想在基类上使用方法 x()
,但我想表达 x()
在子类上已弃用。这意味着调用 x()
的代码只有在调用基类实例上的方法时才应该这样做。
因此这里的非答案是:甚至不要考虑做那样的事情。一个方法要么在所有继承级别上都“可以被调用”,要么不是。仅对子类施加这样的限制是没有意义的。
所以真正的答案在这里:退后一步,考虑为什么你有这个想法。然后寻找其他方法来解决该问题。
考虑到关于隐藏它的评论:同样的故事。从技术上讲:您不能隐藏方法。因为,正如调用 foo.bar()
时所述,它是某些基类 foo
实例的有效语句 - 那么当 foo 时它也需要是一个有效语句
恰好是子类的实例。
唯一合法的是:
- 在 base 方法上有 javadoc 解释子类可能会重写方法而不做任何事情(或抛出异常)
- 那么,好吧,让你的子类方法做任何需要的事情
关于java - 是否可以在子类中弃用父类(super class)的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49391347/