0

オーバーライドされるメソッドがあり、このメソッドでは、オーバーライドされるメソッドを呼び出すために super が使用されます。ただし、このメソッド内のコードは、いくつかのクラスで使用するものであるため、このコードを 1 つのクラスの 1 つのメソッドに入れて再利用したいと考えています。しかし、このコードではキーワード super を使用しているため、オーバーライドされたメソッドの参照を新しいメソッドに渡す方法がわかりません。たとえば、class1 を含む元のメソッドは次のとおりです。

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
   /* Lots of code goes here, followed by the super call */
   return super.onOptionsItemSelected(item);
}

クラス 2 で:

public boolean onOptionsItemSelected(MenuItem item)
{
   /* Code from class1 gets relocated here. But how do I call super on the original method? */

}
4

2 に答える 2

1

クラス 2 がクラス 1 の共通の祖先でない限り、それを super で呼び出すことはできません。コードを継承によって関連付けられていない別のクラスに移動した場合、オブジェクト構成を使用することを余儀なくされます。つまり、クラス 1 (現在スーパー呼び出しが存在する場所) には、クラス 2 (コードが移動された場所) へのオブジェクト参照が必要になります。 ) オブジェクトを使用して、指定されたメソッドにアクセスします。

public boolean onOptionsItemSelected(MenuItem item)
{
   /* Lots of code goes here, followed by the super call */
   return this.myRef.onOptionsItemSelected(item);
}

または、問題のメソッドを静的にすることもできます。その場合、それを公開するクラスを介してアクセスできます (Util と呼びます)。

public boolean onOptionsItemSelected(MenuItem item)
    {
       /* Lots of code goes here, followed by the super call */
       return Util.onOptionsItemSelected(item);
    }

ただし、メソッドの機能によっては、メソッドを静的にすることができない場合があります。

于 2012-05-28T13:52:00.287 に答える
0

Class2 を Class1 と同じクラスに拡張するだけです。

この回答の残りの部分は、Class1 が Class2 から継承されていないことを前提としています。

これ以上の文脈がなければ、これが適切かどうかを言うのは難しいですが、変更してみてください

public boolean onOptionsItemSelected(MenuItem item)

public static boolean onOptionsItemSelected(MenuItem item)、および呼び出し

YourClassName.onOptionsItemSelected(yourArgument)

于 2012-05-28T13:53:34.930 に答える