我们为什么要覆盖一个方法?

最近我被问到这个问题“为什么要覆盖一种方法?”

我回答说,如果我有一个包含10个方法的类,并且我想使用除了一个方法之外的所有function,那么我将覆盖该方法以拥有自己的function。

然后面试官在那种情况下回答为什么我们不能用不同的名字写一个新方法而是使用那种方法。

是的,这也是对的。 现在我很困惑。 覆盖方法的真正目标是什么?

有人可以告诉我吗? 谢谢大家。

如果您将在派生类中为该方法指定另一个名称,则无法使用相同的接口调用它。 您始终可以通过基类指针调用它。

Base p = new Derived(); p.overrideMethod(); 

如果Derived类是从Base派生的,那么它将自动调用派生版本而不是Base。 如果名称不同,则无法进行。 它被称为针对接口而不是实现的代码。

好吧,告诉你的面试官应该总是编码接口,而不是实现:)

为什么我们不能用不同的名称编写一个新方法,而是使用该方法

这是因为我们想要使用多态 。 你可以告诉采访者这个例子:有一个模块可以调用你给它的对象的特定方法; 现在想象你不能改变那个模块(例如没有来源)。 你不能告诉它使用不同的方法,但你可以给它一个子类的对象,它已经覆盖了该方法。 对于模块,似乎没有任何改变。

在实践中,通常情况下您可以更改该模块但不想这样做。

我回答说,如果我有一个包含10个方法的类,并且我想使用除了一个方法之外的所有function,那么我将覆盖该方法以拥有自己的function。

=>经常打破Liskov替换原则的方法 … =>非常糟糕的OO设计

你在这个“rest”的网络上有很多例子,但你可以在这里找到一个很好的解释。

覆盖的好处是:定义特定于子类类型的行为的能力,这意味着子类可以根据其需求实现父类方法。

一个使用接口允许多个实现,一个使用重写来简化接口的实现(例如,在实现WindowListener时 ,通常会扩展并覆盖WindowAdapter的方法,以便不需要为默认情况下的情况提供定义行为就足够了)。 在这种情况下,添加新方法而不是覆盖将不起作用,因为调用者理解接口并调用其方法; 覆盖的重点在于改变对接口调用的行为。 如果您只是添加了一个新函数,那么调用者就必须知道它,这会破坏一个function的使用者和该function的提供者之间的整个隔离,这是接口的目的。

覆盖是使用inheritance时可用的function。

当从另一个类扩展的类想要使用父类的大部分function并希望在某些情况下实现特定function时使用它。

在这种情况下,我们可以创建与父类具有相同名称和签名的方法。 这样,新方法将屏蔽父方法,并且默认情况下将被调用。

覆盖的主要目标是代码重用 ,它在大项目中可能是有利的,它还提供灵活性意味着您可以从任何类传递不同的输入集并获得输出