oop - 如果编程语言不支持方法覆盖,那么程序员可能面临哪些不便?
问题描述
理论上,如果需要,子类不能覆盖父类的方法。但它在实际方面有何实际影响?程序员会面临什么问题?
解决方案
这是Java中的示例
public class Mammal {
public final int getNumberOfLegs() {
return 4;
}
}
public class Human extends Mammal {
@Override <<-- compilation error!
public int getNumberOfLegs() {
return 2;
}
}
这里我将Mammal
's 方法声明getNumberOfLegs()
为final
,这意味着不允许在子类中覆盖该方法。
- 当我尝试在子类中覆盖它时,出现编译错误。
- 如果我需要覆盖它(就像在这个例子中,人们的腿数不寻常),那么我有一个大问题。
现在想象一下如果 Java 不允许我覆盖子类中的任何方法会发生什么。我将无法在子类中实现具有不同行为的任何方法。
在一些简单的情况下,我将能够解决这个问题。(在这个中,我可以为所有对象添加一个
numberOfLegs
字段。)Mammal
在其他情况下,在类层次结构中共享公共行为会更加困难。(在我设计的示例中,您可以想象我没有预料到
getNumberOfLegs()
可能需要在子类中以不同方式实现。)现在显然您可以通过修改父类的代码而不是在子类中覆盖它来改变行为。然而:- 这减少了您作为程序员的选择,并且
- 它还导致父类对当前和(可能的)未来子类有太多了解。
推荐阅读
- dart - 如何在 Dart 中允许不同行上的参数?
- c++ - Boost 序列化 boost::array 失败
- javascript - 如何通过请求停止 node.js 函数/循环
- python - 在python中生成具有三个类的3个圆形数据集
- java - Thymeleaf th:value 在使用 th:field 时被忽略
- python - 基于另一个相似矩阵对矩阵进行排序的 Numpyic 方法
- javascript - 在 Javascript 中使用委托(使用 XMLHttpRequest AJAX 请求的示例)
- python - WGAN-GP 生成的图像看起来很灰
- ios - 我们可以创建广播上传扩展的 Pod 或 swift 包吗?
- c# - 存储库主签名有效期已过。(NU3037)