无法理解方法覆盖的目的

时间:2014-12-12 19:13:25

标签: oop override

我无法理解OOP中方法覆盖的目的。

为什么不把覆盖的方法放在另一个名字上,如果你需要这个特定的新方法,你只需用他的新名称来调用它,而不是为父类继承的名字?

1 个答案:

答案 0 :(得分:1)

方法重载的一个非常有用的目的是支持跨多个类的干净接口,这些接口都来自公共父级。

这是一个例子。考虑一个名为Integer,Decimal和Fraction的三个类,它们都来自父类Number。 Now Number可能有一个名为Number.increment()的方法,它使Number更大1.在Number类中,这可以像获取内部存储的值并添加1一样简单 - 类似于x = x + 1。对于Integer和Decimal,保留此函数可能会很好。但对于Fraction类,我们可能需要做更好的事情 - 分数可能有两个内部存储的分子和分母值,x和y,我们有(x / y)+1 =(x + y)/年。因此,我们可以超载Fraction'增量'处理这种情况的方法。

从某人(也许是我自己!)的角度来看,使用我的代码,这很好。我不必记住,分数是不同的'在引擎盖下。当我与它们交互时,所有数字对象都会有同样的感觉 - 我只是使用' increment()'功能。这就是我之前所说的成员超载有助于建立一个干净的界面。

如果我们按照你的建议做了并写了一个不同的函数 - 称之为Fraction.otherIncrement() - 那么我必须记得调用Fraction.otherIncrement()而不是Fraction.increment()。不太干净。如果我不小心忘记并调用了Fraction.increment(),那么我真的遇到了麻烦,因为这个功能对分数来说真的没有意义!

所有这些都与封装多态的更一般的想法有关,这些想法是面向对象编程的核心。简而言之(并且这些都不是完美的定义,无论如何!),封装是指应该向用户隐藏某些工作原理的细节。而多态意味着仍然可以以相同的方式与不同的对象进行交互。这两种想法都使大型项目的编程更加可靠,并极大地促进了构建其他人工作的过程。超越方法是实现这些目标的关键方法。