我应该在自定义代码之前还是在重写方法之后调用 super.xxxx()?
是否有一些技能可以识别?
问问题
1010 次
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 回答