java - Liskov 的替换原理与 JAVA 中的覆盖有何关系?完全阻碍和覆盖有什么区别?

标签 java virtual-functions overriding liskov-substitution-principle method-hiding

在编程语言中,如果您希望子对象充当父对象的替代品,并且仍然不应该失去自己的身份(作为子对象),则必须获得父对象的许可。这就是我们在 C# 或 C++ 中将此类方法设为虚拟的原因。这就变成了彻底的隐藏。完全隐藏是否被认为是java中的覆盖? 99% 的时间我在这里有错误的概念,因为我认为我只是考虑隐藏。重写函数是否可以像仅涉及 JAVA 一样完全隐藏?

最佳答案

Liskkiov 的替换原则与返回抽象父实现而不是具体子实现的函数相关联。例如

ArrayList getList vs List getList

在上面的示例中,第一种情况下 getList 方法返回具体的 List 实现,而在第二种情况下 getList 方法返回 List 接口(interface)的实例。现在根据 Liskov 替换原则,应该使用第二种方法,因为第二种方法可以被子类重写以返回 List 的不同具体实现,而在第一个实例中只能返回 ArrayList 子类的 ArrayList。因此,第一种情况不如第二种情况抽象,并且根据里氏替换原则,父级实现应该尽可能抽象,以允许子级根据需要自由实现。

关于方法隐藏,因此只能使用静态方法。 java 中的重写不会隐藏该方法,因为它是在实例级别。然而,对于静态方法,由于该方法是在类级别,所以多态性是不可能的,因此,如果子类创建具有相同名称、参数和返回类型的静态方法并尝试静态访问该方法,则子类会继承它们类版本将被调用,而不是父类(super class)版本,因为子类现在已有效地隐藏了父类(super class)的方法。

关于java - Liskov 的替换原理与 JAVA 中的覆盖有何关系?完全阻碍和覆盖有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40254582/

相关文章:

java - NoClassDefFoundError : scala/ScalaObject in mixed Scala/Java project

c++ - 具有相同纯虚函数的两个基类

jQuery 覆盖旧版本的 jQuery

c# - "x"按钮如何工作以及如何覆盖它?

django - 覆盖 Django 对象序列化程序以摆脱指定的模型

java - 无法保护 Spring 引导管理执行器端点

java - 由于命名空间前缀不同,XmlUnit 2.x 比较 2 个 xml 失败

java - 一个 JFrame 中的两个 JPanel

c++ - 分配给派生类的基类指针

C++:是一个具有虚拟基础但没有虚拟函数的多态类并且具有VTable吗?