2010-04-14 46 views
4

在编写Android应用程序时出现这个问题, ,但它似乎是一个通用编程问题。我怎么知道何时/在哪里调用超类的重写方法

情况是,我从库中扩展(子类)一个类,并重写一个方法。我怎么知道我是否应该调用超类的方法?什么时候? (在重写方法的开始或最后?)

例如,我从Android平台的“Activity”类重写了“public boolean onCreateOptionsMenu(Menu menu)”方法。在一个示例中,我看到有人在方法的末尾写入“return super.onCreateOptionsMenu(menu)”。但我怎么知道它应该这样做呢?这是正确与否?如果我用“super.onCreateOptionsMenu(menu)”开始我的方法,有什么区别?

BR, 亨利

+0

language agnostic? – 2010-04-14 11:51:22

回答

6

我不认为你可以在摘要中回答这个问题:它取决于你重写的超类方法的行为。

根据具体情况,它可能是适当的:

  • 调用超第一
  • 调用超去年
  • 处理某些情况下,你自己(自定义),调用super为休息
  • 永远不会调用super

希望您所覆盖的特定课程的文档能够告诉您是否/何时有必要打电话给超级。

+2

除了文档,一些常识和经验也会引导你在这里。例如,你是否试图做一些除了通常发生的事情(做调用超类方法)或者你想做什么而不是正常行为(不)?你的东西需要先发生还是最后才会发生? – 2010-04-14 11:50:32

0

您不需要调用super.method(),你怎么称呼它,只有当你需要它,你需要它。

0

当您重写子类中的方法时,它取决于您调用该方法的实例的类型。

例如:

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(); 

为实际实例的类型狗的再次执行狗的吃法。

1

不幸的是,这没有规定。您需要参考API文档,并在文档说明您需要时调用super。

有关Android是否需要或不需要的一个提示是,如果您覆盖的方法是生命周期方法之一。在这种情况下,你可以相当肯定你需要调用super。

1

这些都是有效的问题,但不幸的是,这里没有遵循一般规则。

是否需要调用超级方法取决于超级方法是否需要完成某些事情。换句话说:您是在扩展还是替换重写的方法?一个好的API文档应该给你答案。此外,图书馆通常遵循一些约定来明确如何使用它们。

问题的答案在哪里放置超级呼叫取决于你想执行什么时候你是扩展名。它是否需要在超级方法之前或之后运行?大多数情况下,你首先打电话超级,然后再做一些额外的事情但是,如果您需要为super方法准备一些内容,例如修改某些对象状态或操作参数,请在超级调用之前放置代码。再次,API文档应该在这里给你答案。

1

如果您忘记调用super,大多数情况下Android会导致异常。 我相信,如果你不这样做,它不会抛出,你不必打电话给超级。

在谷歌网上论坛讨论的一些最佳实践发展的生命周期方法(它们没有正式的数据支持,而是由许多程序员使用):

  • 如果你是喜欢 一个创建方法的onCreate,的onResume等作为第一个声明致电超级 。因此,您可以确保准备好了超类准备的所有内容。
  • 如果您在像onSaveInstanceState这样的关闭方法中,onPause调用super last。现在你可以确定,在你完成所有工作之前,没有任何东西会被移除或变成坏的状态。
相关问题