3

我应该在自定义代码之前还是在重写方法之后调用 super.xxxx()?
是否有一些技能可以识别?

4

2 回答 2

6

简短的回答:这取决于。

长答案:您需要了解父类中方法的实现是做什么的。

  • 在某些情况下,超级方法会执行一些“初始化”工作,以使被覆盖的方法能够顺利运行。在这种情况下,super.myMethod()调用应该是方法中的第一行。
  • 在其他一些情况下,父类中方法的实现可能负责一些清理(或某种终结)操作。那是您需要调用覆盖实现中super最后一行的时候。
  • 然后有些情况下顺序无关紧要,但你必须调用 super 方法,因为基类中的实现执行了一些必要的操作;尽管这些操作的顺序无关紧要。大多数Activity生命周期方法都属于这一类。这就是为什么你必须调用它,super.onCreate()尽管你可以在你的onCreate().
  • 最后,也有不需要调用 super 方法的情况。基类有一个默认实现,您可以选择使用或忽略它。您可能还会在这里执行 if-else:例如,您可能会调用 super 实现。如果它返回 a null,您可能会创建一个新对象并返回它。

是否有一些技能可以识别?

  • 阅读方法文档,看看是否有提到super必须调用该方法的顺序。
  • 浏览基类的源代码,看看你是否能弄清楚它是否做了任何需要以特定顺序调用它的事情。
于 2012-05-28T03:49:32.293 回答
0

   (非常 OOPy)通常,这个想法是在您需要父母的功能时调用 super 。我知道这看起来很明显,但它在清理功能方面有影响:

Init:
    super.init
    ... your initialization code

Delete:
    ... your deletion code here <-- important
    super.delete

SomeOtherRandomMethod:
    ... your code may go here if it does not need any state from the parent
    super.SomeOtherRandomMethod
    ... otherwise it can go here

    我发现在覆盖开始时调用 super 的代码更简单/更干净(除非有一些非常具体的理由不这样做),并确保在我完成调用父级的销毁/删除/释放/销毁我自己的清理(我们绝对不希望父母从我们下面倾倒对象!)

于 2012-05-28T03:43:31.337 回答