我应该在我的自定义代码之前或在我覆盖方法之后调用super.xxxx()吗?

时间:2012-05-28 03:21:54

标签: android

我应该在自定义代码之前调用super.xxxx(),还是在覆盖方法之后调用? 是否有识别技能?

2 个答案:

答案 0 :(得分:6)

简短的回答:它取决于。

答案很长: 您需要了解父类中方法的实现。

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

是否有识别技能?

  • 阅读方法文档,看看是否提及必须调用super方法的顺序。
  • 浏览基类的源代码,看看是否可以确定是否有必要按特定顺序调用它。

答案 1 :(得分: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

我发现在覆盖开始时调用超级代码更简单/更清晰(除非有一些真正的特定原因没有),并确保我调用父代的destroy / 之后删除/免费/销毁我已经完成了自己的清理工作(我们绝对不希望父对象从我们手中转出!)