java - 是否可以在子类中弃用父类(super class)的方法?

标签 java inheritance

我有一个这样的父类(super class):

public abstract class Foo {

    //some method here    

    public void aMethod() {
        //some code
    }
}

和 2 个子类 BarOneBarTwo 扩展了 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/

相关文章:

java - 无法理解泛型和继承

c# - 如何以通用类型安全的方式验证层次结构中的类?

html - CSS - 让 div 继承高度

c++ - c++中的单虚拟继承编译器优化?

java - 数值提升是否适用于 Java 中的常量?

java - 将管理基本路径设置为 "/",并将 server.context-path 设置为 myApp

java - 如何创建动态选择选项

java - Java中的Integer.parseint,当 '+'先出现时异常

java - 我在运行 Java 程序时遇到问题

c++ - 是否可以颠倒破坏顺序?