カスタムコードの前、またはメソッドをオーバーライドした後にsuper.xxxx()を呼び出す必要がありますか?
識別するスキルはありますか?
質問する
1010 次
2 に答える
6
簡単な答え:それは状況によって異なります。
長い答え:親クラスのメソッドの実装が何をするかを理解する必要があります。
- スーパーメソッドが、オーバーライドされたメソッドがスムーズに機能するために必要な「初期化」作業を行う場合があります。このような場合、
super.myMethod()
呼び出しはメソッドの最初の行である必要があります。 - 他のいくつかのケースでは、親クラスのメソッドの実装が、いくつかのクリーンアップ(またはある種のファイナライズ)操作を担当する可能性があります。これは、オーバーライドされた実装
super
の最後の行を呼び出す必要がある場合です。 - 次に、順序が重要ではない状況がありますが、基本クラスの実装は必要な操作を実行するため、スーパーメソッドを呼び出す必要があります。これらの操作の順序は重要ではありませんが。ほとんどの
Activity
ライフサイクルメソッドはこのカテゴリに分類されます。のどの時点でもそれを行うことができますが、それがあなたが電話しなければならない理由です。super.onCreate()
onCreate()
- 最後に、スーパーメソッドの呼び出しが不要な場合もあります。基本クラスには、使用または無視することを選択できるデフォルトの実装があります。また、ここでif-elseを実行することになる可能性があります。たとえば、スーパー実装を呼び出す場合があります。を返す場合は
null
、新しいオブジェクトを作成して、代わりにそれを返すことができます。
識別するスキルはありますか?
- メソッドのドキュメントを読み、メソッドを
super
呼び出す必要がある順序についての言及があるかどうかを確認します。 - 基本クラスのソースコードを調べて、特定の順序で呼び出す必要があることを実行できるかどうかを確認します。
于 2012-05-28T03:49:32.293 に答える
0
(非常にOOPy)一般的に、親の機能が必要なときにスーパーを呼び出すという考え方です。私はそれがかなり明白に見えることを知っていますが、クリーンアップ機能に関しては意味があります:
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のコードを呼び出す方が簡単でクリーンであり(特に理由がない限り)、完了後に親のdestroy / delete / free/destructionを呼び出すようにしてください。私自身のクリーンアップ(親が私たちの下からオブジェクトをダンプすることは絶対に望んでいません!)
于 2012-05-28T03:43:31.337 に答える