16

多くのAndroidメソッド、特にコンストラクターやオーバーライドされたメソッドでは、 super()を使用して親クラスのメソッドを呼び出す必要があります。Eclipse Source> Override / Implementation Methods ...を使用すると、次のようなTODOタグを持つテンプレートからコードを取得します。

public MyCanvas(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}


@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub      
    super.onDraw(canvas);
} 

私はスーパークラスがそれぞれの場合に何をするのかを正確に理解していないので、常に//TODOタグの正確な場所にコードを挿入します。この例では、コンストラクターのコードの前とonDraw()のコードの後に​​super()を呼び出します。

生成されたコード内のこれらのコード挿入場所に常に依存できますか?super()を呼び出すときの簡単なルール/説明はありますか?

4

3 に答える 3

15

これは良い質問です。残念ながら、これには簡単なルールはありません。スーパークラスの実装が何をするかを知る必要があります。時々(のようにView.onDraw())、スーパークラスの実装は何もしません。super()の呼び出しは無害であり、不要です。その他の場合(などActivity.onCreate())、スーパークラスの実装は、サブクラスの処理のある時点で実行する必要のある重要な操作を実行します。super()を呼び出すと何が起こるかは、サブクラスでの処理の前に、場合によっては他のポイントで発生する必要があります。スーパークラスの処理を完全に独自のものに置き換えたい場合があります。その場合は、super()をまったく呼び出さないでください。サブクラスのロジックの任意のポイント(または複数のポイント)でスーパークラスバージョンを呼び出す完全な自由があります。

コンストラクターでは、スーパークラスコンストラクター(存在する場合)の呼び出しは、メソッドの最初のものでなければなりません。持っていない場合、コンパイラーは、スーパークラスの引数なしコンストラクターへの呼び出しを自動的に挿入します。(スーパークラスに引数のないコンストラクターがない場合、またはサブクラスにアクセスできない場合、コンパイラーはエラーを生成します。)

ドキュメントに十分な情報が記載されていない場合は、ソースコードを確認する必要があります。Androidコードはこちらから入手できます(Gingerbreadリリース)。APIコードはの下にありcoreます。

編集コードはgit.kernel.orgでは利用できなくなりました。コードを参照できる他の2つの場所は次のとおりです。

メインコードはリポジトリにありますプラットフォーム>フレームワーク>ベース

于 2011-02-14T17:21:56.333 に答える
3

生成されたコード内のこれらのコード挿入場所に常に依存できますか?

いいえ、電話をかけたくない場合がありますsuper.method。最初に呼び出したい場合もあれば、最後の場所で呼び出したい場合もあります。状況によって異なります。しかし、私はコンストラクターではなく、メソッドについて話しているのです。

super()を呼び出すときの簡単なルール/説明はありますか?

あなたはいつもsuper前の答えのポイントとしてすべてをしなければならないでしょう。superを呼び出さない唯一のケースは、スーパークラスのコンストラクターにパラメーターがない場合です。その場合、コンパイラはあなたのsuperためにを置きます。

私はスーパークラスがそれぞれの場合に何をするのかを正確に理解していないので、常に//TODOタグの正確な場所にコードを挿入します

疑問がある場合(私はスーパーメソッドについて話している)、いつでもソースコードを見ることができます。Googleコード検索はそうするための良いリソースです。次に、コードをスーパーメソッドの前に置くか後に置くかを決定できます。または、スーパーメソッドをまったく入れないでください。

スーパーメソッドを配置しないことは、コンパイル時に有効であることに注意してください。ただし、Androidの一部のメソッドは、スーパーメソッド(たとえば、クラスのonResumeメソッド)を呼び出さないと機能しません。Activity

また、実行時にスーパーメソッドを実行するかどうかを決定する場合もあります。この古典的な例を考えてみましょう。

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if( KeyEvent.KEYCODE_BACK == event.getKeyCode() ){
        return true;
    }
    return super.onKeyUp(keyCode, event);
}

ユーザーが戻るキーを押した場合、スーパーメソッドは呼び出されません。ユーザーがそうしなかった場合は、作業をスーパーメソッドに委任します。

于 2011-02-14T17:14:10.533 に答える