如果一种编程语言不支持方法覆盖,那么程序员可能会面临哪些不便?
If a programming language does not support method overriding then what inconveniences the programmer might face?
理论上,如果需要,子 class 不能覆盖父 class 方法。但是它在实际方面实际上有什么影响呢?程序员会面临哪些问题?
这是 Java
中的示例
public class Mammal {
public final int getNumberOfLegs() {
return 4;
}
}
public class Human extends Mammal {
@Override <<-- compilation error!
public int getNumberOfLegs() {
return 2;
}
}
这里我把Mammal
的方法getNumberOfLegs()
声明为final
,也就是说不允许重写child中的方法class.
- 当我尝试在 child class 中覆盖它时,出现编译错误。
- 如果我需要覆盖它(如本例中人们的腿数异常多),那我就有大问题了。
现在想象一下如果 Java 不允许我覆盖 child class 中的 any 方法会发生什么。我将无法在 child class 中实现任何具有不同行为的方法。
在一些简单的情况下,我将能够解决这个问题。 (在这一个中,我可以向所有 Mammal
objects 添加一个 numberOfLegs
字段。)
在其他情况下,在 class 层次结构中共享共同行为会更加困难。 (在我设计的示例中,您可以想象我没有预料到 getNumberOfLegs()
可能 需要在 child class 中以不同的方式实现。 ) 现在很明显,您可以通过修改 parent class 中的代码来更改行为,而不是在 child class 中覆盖它。然而:
- 这减少了您作为程序员的选择,并且
- 它还会导致 parent classes 对当前和(可能的)未来有太多了解 child classes.
理论上,如果需要,子 class 不能覆盖父 class 方法。但是它在实际方面实际上有什么影响呢?程序员会面临哪些问题?
这是 Java
中的示例public class Mammal {
public final int getNumberOfLegs() {
return 4;
}
}
public class Human extends Mammal {
@Override <<-- compilation error!
public int getNumberOfLegs() {
return 2;
}
}
这里我把Mammal
的方法getNumberOfLegs()
声明为final
,也就是说不允许重写child中的方法class.
- 当我尝试在 child class 中覆盖它时,出现编译错误。
- 如果我需要覆盖它(如本例中人们的腿数异常多),那我就有大问题了。
现在想象一下如果 Java 不允许我覆盖 child class 中的 any 方法会发生什么。我将无法在 child class 中实现任何具有不同行为的方法。
在一些简单的情况下,我将能够解决这个问题。 (在这一个中,我可以向所有
Mammal
objects 添加一个numberOfLegs
字段。)在其他情况下,在 class 层次结构中共享共同行为会更加困难。 (在我设计的示例中,您可以想象我没有预料到
getNumberOfLegs()
可能 需要在 child class 中以不同的方式实现。 ) 现在很明显,您可以通过修改 parent class 中的代码来更改行为,而不是在 child class 中覆盖它。然而:- 这减少了您作为程序员的选择,并且
- 它还会导致 parent classes 对当前和(可能的)未来有太多了解 child classes.