为什么要重写一个方法?

4

最近我被问到一个问题:“为什么要重写一个方法?”

我回答说,如果我有一个类有十个方法,我想使用其中所有的功能,除了一个方法,那么我就会重写那个方法来实现自己的功能。

然后面试官问道:既然如此,为什么不能编写一个新方法,并给它取一个不同的名称,然后使用该方法呢?

是的,这也是对的。现在我感到困惑了。重写一个方法的真正目的是什么?

请问有人能告诉我吗?非常感谢!


继承是首先想到的... - jahroy
告诉你的面试官,应该始终针对接口编写代码,而不是实现。 :) - Juan Antonio Gomez Moriano
1
将一个实现更改,使其更具体适用于子类。 - Stultuske
覆盖已经实现的方法往往是破坏Liskov替换原则(非常糟糕的设计)的根本原因。通常,我们会“覆盖”/(实现更恰当的说法是)一个接口/抽象方法。 - Mik378
我知道这是半开玩笑的,但它根本没有回答问题。 - Michael Piefel
你说得对,只是让我震惊的是,一个招聘者竟然不理解面向对象编程的基础知识 :) - Juan Antonio Gomez Moriano
7个回答

4
如果您在派生类中给该方法命名为另一个名称,则无法使用相同的接口调用它。您始终可以通过基类指针调用它。
例如:
Base p = new Derived();
p.overrideMethod();

如果派生类从基类继承,那么它将自动调用派生版本而不是基础版本。如果名称不同,则不可能这样做。这被称为针对接口而非实现的编码。


1
如果我有一个包含10个方法的类,并且我想使用除了其中一个方法之外的所有功能,那么我会覆盖该方法以实现自己的功能。
=> 这往往是违反Liskov替换原则的一种方式... => 非常糟糕的面向对象设计
网络上有许多这种“破坏”的例子,但您可以在此处找到一个很好的解释。

1

.

由于我们想使用多态性,所以不能编写一个使用不同名称的新方法并使用该方法。您可以告诉面试官这个例子:有一个模块调用您提供的对象上的特定方法;现在想象一下,您无法更改该模块(例如没有源代码)。您无法告诉它使用不同的方法,但是您可以提供一个覆盖该方法的子类对象。对于该模块,看起来什么都没有改变。在实践中,通常情况下您可能可以更改该模块,但却不想这样做。

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

0

接口可以允许多个实现,而覆盖则可以简化接口的实现(例如,在实现WindowListener时,通常会扩展并覆盖WindowAdapter的方法,以便在默认行为足够的情况下不需要提供定义)。在这种情况下,添加新方法而不是覆盖将无法工作,因为调用者了解接口并调用其方法;在此处覆盖的整个重点是更改对接口的调用的行为。如果您只是添加了一个新函数,则调用者必须知道它,这就破坏了消费功能和提供该功能的提供者之间的完全隔离,这正是接口旨在提供的。


0

覆盖是在使用继承时可用的一项功能。

当一个类继承自另一个类并希望在大多数情况下使用父类的大部分特性,但在某些情况下希望实现特定功能时,就可以使用它。

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接