Liskov 的替换原则与 JAVA 中的覆盖有何关系?完全阻碍和覆盖之间有什么区别?
How Liskov's Principle of substitution is related to overriding in JAVA? What is different between complete hinding and overriding?
在编程语言中,如果您希望子对象充当父对象的替代品并且它不应该失去自己的身份(作为子对象),您必须获得父对象的许可。这就是我们在 C# 或 C++ 中使此类方法成为虚拟方法的原因。这变成了完全隐藏。在 java 中完全隐藏是否被视为压倒一切? 99% 的时间我在这里有错误的概念,因为我认为我只是在考虑它隐藏。仅就 JAVA 而言,重写函数可以完全隐藏吗?
Liskkiov 的替换原则链接到一个函数 returning 一个抽象的父实现而不是具体的子实现。例如
ArrayList getList vs List getList
在上面的示例中,第一种情况下 getList 方法 return 是一个具体的 List 实现,第二种情况下 getList 方法 return 是 List 接口的一个实例。现在,根据 Liskov 替换原则,应该使用第二种方法,因为第二种方法可以被 subclasses 覆盖到 List 的 return 不同的具体实现,而在第一个实例中只有一个 ArrayList 的 sub classes 的 ArrayList 可以 returned。因此,第一种情况不如第二种情况抽象,并且根据 Liskov 的替换原则,父级实现应尽可能抽象,以允许子级根据需要自由实现。
关于方法隐藏,只有静态方法才有可能。 java 中的覆盖不会隐藏该方法,因为它是在实例级别。但是对于静态方法,由于该方法处于 class 级别,多态性是不可能的,因此如果子 class 创建具有相同名称、参数和 return 类型并尝试静态访问该方法 sub classes 版本将被调用而不是 super classes 版本,因为 sub class 现在已经有效地隐藏了 super 的方法class。
在编程语言中,如果您希望子对象充当父对象的替代品并且它不应该失去自己的身份(作为子对象),您必须获得父对象的许可。这就是我们在 C# 或 C++ 中使此类方法成为虚拟方法的原因。这变成了完全隐藏。在 java 中完全隐藏是否被视为压倒一切? 99% 的时间我在这里有错误的概念,因为我认为我只是在考虑它隐藏。仅就 JAVA 而言,重写函数可以完全隐藏吗?
Liskkiov 的替换原则链接到一个函数 returning 一个抽象的父实现而不是具体的子实现。例如
ArrayList getList vs List getList
在上面的示例中,第一种情况下 getList 方法 return 是一个具体的 List 实现,第二种情况下 getList 方法 return 是 List 接口的一个实例。现在,根据 Liskov 替换原则,应该使用第二种方法,因为第二种方法可以被 subclasses 覆盖到 List 的 return 不同的具体实现,而在第一个实例中只有一个 ArrayList 的 sub classes 的 ArrayList 可以 returned。因此,第一种情况不如第二种情况抽象,并且根据 Liskov 的替换原则,父级实现应尽可能抽象,以允许子级根据需要自由实现。
关于方法隐藏,只有静态方法才有可能。 java 中的覆盖不会隐藏该方法,因为它是在实例级别。但是对于静态方法,由于该方法处于 class 级别,多态性是不可能的,因此如果子 class 创建具有相同名称、参数和 return 类型并尝试静态访问该方法 sub classes 版本将被调用而不是 super classes 版本,因为 sub class 现在已经有效地隐藏了 super 的方法class。