0

私はこれを Android のコンテキストで行っていますが、私の問題は Java を理解することです。私は両方とも少し慣れていないので、ここで正しい用語を使用していることを願っています。

SuperActivity と呼ばれるスーパー クラス (Android アクティビティ拡張機能) から継承/拡張するサブクラスがいくつかあります。Network という名前の別のクラス タイプ (Android サービス) も定義しました。私のスーパークラスでは、ServiceConnection という (Android) インターフェイスを実装する匿名内部クラスを定義しています。そのインターフェイスは、Android システムによって呼び出されるメソッドを指定します (したがって、私は定義しています)。匿名の ServiceConnection を実装する私の内部クラスのインスタンスを bindService() というメソッドに渡す必要があります。これにより、その匿名の内部クラス内のメソッドを後で呼び出すことができます。

前述したように、匿名の内部クラスを定義するスーパークラスをサブクラス化しています。その匿名内部クラスのメソッドは、サブクラス インスタンスにインスタンス変数を設定する必要があります。設定する必要があるインスタンス変数は、ここでは mNetwork と呼ばれます。

スーパークラスでは:

public class SuperActivity extends Activity {
    protected Network mNetwork;

    protected ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mNetwork = ((Network.NetworkBinder)service).getService();
        }
    }

    void bindNetwork() {
        bindService( new Intent(this, Network.class), mConnection, Context.BIND_AUTO_CREATE);
    }
}

そこで、サブクラスを作成し、その bindNetwork() メソッドを呼び出します。匿名内部クラスで定義された OnServiceConnected() メソッドが呼び出された後、mNetwork と呼ばれるサブクラスのインスタンス メンバーが null であるため、明らかに mConnection に割り当てられた匿名内部クラスは私のサブクラスのインスタンス メンバーではありません。

さらに、匿名の内部クラスを保持する mConnection 変数を取得し、それに対して getClass().getName() または toString() を呼び出すと、サブクラスではなく、スーパークラスの内部クラスであることが示されます。

明らかに、私はJavaの継承について何かを理解していません。匿名の内部クラス内のメソッドによって設定された独自の mNetwork 変数を持つ、多数のサブクラスが必要です。匿名の内部クラスの定義を各サブクラスに切り貼りしたくありません。方法があるに違いない。私は何を間違っていますか?

4

1 に答える 1

0

方法があります:

  1. ネットワーク フィールドにアクセスするためのインターフェイスを実装します ( などNetworkProvider) 。
  2. 匿名クラスを実際のクラスに抽出する
  3. NetworkProvider を ServiceConnection 実装に渡します

アプローチを説明するための基本的なスニペットを次に示します。

public interface NetworkProvider {
  public void setNetwork(Network network);
  public Network getNetwork();
}

public class SuperActivity extends Activity implements NetworkProvider {
  private Network mNetwork;
  @Override public  void setNetwork(Network network){this.mNetwork = network;}
  @Override Network void getNetwork(){return mNetwork;}

  protected ServiceConnection mConnection = new MyServiceConnection(this);

  // more methods
}

public class MyServiceConnection implements ServiceConnection {  // or 'extends' if it's a class
  private NetworkProvider networkProvider;
  public MyService(NetworkProvider networkProvider) {this.networkProvider = networkProvider;}

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
      networkProvider.setNetwork(((Network.NetworkBinder)service).getService());
  }
}
于 2010-07-13T08:50:21.427 に答える