我该如何知道何时/何地调用超类的重写方法?

4
这个问题是我在编写Android应用程序时遇到的,但似乎它更像是一个普遍的编程问题。
情况是这样的,我正在扩展(子类化)一个来自库的类,并覆盖一个方法。我如何知道是否应该调用超类的方法?什么时候调用呢?(在重写的方法开始或结束时?)
例如,我正在Android平台上覆盖“Activity”类中的“public boolean onCreateOptionsMenu(Menu menu)”方法。我看到有人在示例中在方法的结尾处写了“return super.onCreateOptionsMenu(menu)”。但是我怎么知道应该这样做?这样做是否正确?如果我以“super.onCreateOptionsMenu(menu)”开头开始我的方法会有什么不同呢?
敬礼, Henry
6个回答

7

我认为你无法在抽象层面上回答这个问题:它取决于你要重写的超类方法的行为。

根据情况,可能适合采取以下做法:

  • 先调用super
  • 最后调用super
  • 自己处理一些情况(定制),其余情况调用super
  • 永远不要调用super

希望你要重写的特定类的文档会告诉你何时需要调用super。


2
除了文档外,一些常识和经验也会在这里指导您。例如,您是要在正常发生的事情之外做些什么(调用超类方法),还是要代替正常行为(不要)?你的东西需要先发生还是可以在最后发生。 - Bert F

1

很遗憾,这没有一条固定规则。你需要参考API文档,并在文档中要求调用super时进行调用。

如果你重写的方法是Android的生命周期方法之一,则可能需要调用super。在这种情况下,你可以相当确定需要调用super。


1

这些都是有效的问题,但不幸的是在这里没有通用的规则可供遵循。

是否需要调用super方法取决于super方法是否需要执行某些操作。换句话说:您是扩展还是替换了被覆盖的方法?类的良好API文档应该能够给出答案。此外,库通常遵循一些约定以明确如何使用它们。

回答“在哪里放置super调用”的问题取决于您想要执行扩展的时间。它需要在super方法之前或之后运行吗?大多数情况下,您首先调用super,然后再做一些额外的事情。但是,如果您需要为super方法做一些准备工作,例如修改某个对象状态或操作参数,则将代码放在super调用之前。同样,API文档应该能够给出答案。


1

如果您忘记调用super,Android在大多数情况下会引发异常。

在Google Groups的讨论中,一些生命周期方法的最佳实践得到了发展(虽然它们没有官方数据支持,但被许多程序员使用):

  • 如果您在像onCreate、onResume等创建方法中,请将super作为第一条语句进行调用。这样,您可以确保从超类准备好的所有内容都已准备就绪。
  • 如果您在像onSaveInstanceState、onPause等关闭方法中,请将super作为最后一条语句进行调用。现在,您可以确保在完成所有操作之前,不会删除或更改任何内容以使其处于错误状态。

0

你不需要调用super.method(),只有在需要的地方才需要调用它。


-1

当你在子类中覆盖一个方法时,它取决于你调用该方法的实例的类型。

例如:

   Class Animal{
        public eat(){
           //..
        }
   }

   Class Dog extends Animal{
        public eat(){
           //..
        }
  }

now if you say new Dog().eat() 
it executes Dog's eat method.

if you say new Animal().eat()
it executes Animal's eat method.

你可能有这样的代码

       Animal a = new Dog();
       a.eat();

这将再次执行 Dog 的 eat 方法,因为实际实例的类型是 Dog。


我认为问题不在于调用哪个方法,而在于如何决定在覆盖方法中何时/何处调用超类的方法。 - LWChris

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