在编程语言中,如果您希望子对象充当父对象的替代品,并且它仍然不应该失去自己的身份(作为子对象),则必须获得父对象的许可。这就是为什么我们在 C# 或 C++ 中将这些方法设为虚拟的原因。这变成了一个完全的隐藏。完全隐藏在java中被认为是覆盖吗?99% 的时间我在这里有错误的概念,因为我认为我只是在考虑隐藏它。一个被覆盖的函数可以像只关注 JAVA 的那样完全隐藏吗?
问问题
144 次
1 回答
1
Liskkiov 的替换原则与返回抽象父实现而不是具体子实现的函数相关联。例如
ArrayList getList vs List getList
在上面的示例中,在第一种情况下,getList 方法返回一个具体的 List 实现,在第二种情况下,getList 方法返回一个 List 接口的实例。现在根据 Liskov 替换原则,应该使用第二种方法,因为第二种方法可以被子类覆盖以返回 List 的不同具体实现,而在第一种情况下,只能返回 ArrayList 子类的 ArrayList。因此,第一种情况不如第二种情况抽象,并且根据 Liskov 的替换原则,父实现应尽可能抽象,以允许子实现根据需要自由实现。
关于方法隐藏,只有静态方法才有可能。java中的覆盖不会隐藏方法,因为它是在实例级别。但是对于静态方法,由于该方法处于类级别,因此不可能实现多态性,因此如果子类创建具有相同名称、参数和返回类型的静态方法并尝试静态访问该方法,则子类会继承它们将调用类版本而不是超类版本,因为子类现在已有效地从超类中隐藏了该方法。
于 2016-10-26T05:57:17.767 回答