【问题标题】:Why should we override a method? [duplicate]为什么我们要重写一个方法? [复制]
【发布时间】:2014-06-16 06:55:08
【问题描述】:

最近有人问我这个问题“为什么要覆盖一个方法?”

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

然后面试官回答在那种情况下为什么我们不能用不同的名称编写一个新方法并使用该方法来代替。

是的,这也是正确的。现在我很困惑。重写方法的真正目的是什么?

谁能告诉我?谢谢大家。

【问题讨论】:

  • 想到继承...
  • 好吧,告诉你的面试官应该总是针对接口而不是实现进行编码:)
  • 更改实现。使其更具体到子类。
  • 覆盖已经实现的方法通常是破坏 Liskov 替换原则的根本原因(非常糟糕的设计)。一般来说,我们“覆盖”/(实现更合适的词)一个接口/抽象方法。
  • 我知道这是在开玩笑,但它根本没有解决问题。

标签: java oop overriding


【解决方案1】:

如果你要给派生类中的方法取另一个名字,你不能用相同的接口调用它。您始终可以通过基类指针调用它。

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

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

【讨论】:

    【解决方案2】:

    .

    为什么我们不能用不同的名称编写一个新方法并使用该方法来代替

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

    实际上,您可以更改该模块但不想要更改的情况也经常发生。

    【讨论】:

      【解决方案3】:

      我回答说,如果我有一个有 10 种方法的类并且我想使用所有方法 它的功能除了一种方法,然后我将覆盖该方法 拥有自己的功能。

      => 很多时候是打破Liskov Substitution principle 的方法... => 非常糟糕的 OO 设计

      你有很多关于这个“休息”的例子,但你可以找到一个很好的解释here

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            当一个从另一个类扩展而来的类想要使用父类的大部分特性并且想要在某些情况下实现特定功能时使用它。

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 2013-06-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-12-12
                • 1970-01-01
                • 2023-03-04
                • 1970-01-01
                • 2021-02-08
                相关资源
                最近更新 更多