编写Android应用程序时遇到了这个问题, 但它似乎是一个更普遍的编程问题。
情况是,我正在从库中扩展(子类化)一个类,并覆盖一个方法。我怎么知道我是否应该调用超类的方法?什么时候? (在重写方法的开头或最后?)
例如,我在Android平台的类“Activity”中覆盖了“public boolean onCreateOptionsMenu(Menu menu)”方法。在一个例子中,我看到有人在方法的最后写了“return super.onCreateOptionsMenu(menu)”。但我怎么知道它应该这样做?这是对还是不对?如果我用“super.onCreateOptionsMenu(menu)”开始我的方法有什么区别?
BR, 亨利
答案 0 :(得分:7)
我认为你不能在摘要中回答这个问题:它取决于你所覆盖的超类方法的行为。
根据具体情况,可能适合:
希望您覆盖的特定班级的文档会告诉您是否/何时需要拨打超级电话。
答案 1 :(得分:1)
不幸的是,没有这方面的规则。如果文档说你需要,你需要参考API文档并调用super。
关于你是否可能需要或不需要Android的一个提示是你所覆盖的方法是否是生命周期方法之一。在这种情况下,您可以确定您需要调用super。
答案 2 :(得分:1)
这些是有效的问题,但不幸的是,这里没有一般规则。
是否需要调用super方法取决于super方法是否需要执行某些操作。换句话说:您是在扩展还是替换被覆盖的方法?一个好的API文档应该给你答案。此外,图书馆通常遵循一些惯例来明确如何使用它们。
放置超级电话的问题的答案取决于您何时执行扩展。是否需要在超级方法之前或之后运行?大多数情况下,你首先打电话给超级,然后做额外的事但是如果你需要为super方法准备一些东西,例如修改一些对象状态或操纵参数,你可以在超级调用之前放置代码。同样,API文档应该在这里给出答案。
答案 3 :(得分:1)
如果您忘记拨打超级电话,Android会在大多数情况下导致异常。 如果你不这样做,我会相信你不必打电话给超级而且它不会扔掉。
在谷歌小组讨论中,生命周期方法的一些最佳实践得到了发展(它们没有正式的数据支持,但被许多程序员使用):
答案 4 :(得分:0)
您不需要调用super.method(),只有在您需要它时才需要它。
答案 5 :(得分:-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's eat方法,因为实际的实例是Dog。