4

Web サービスにアクセスする Java ライブラリを作成していますが、ライブラリはさまざまなプラットフォームで呼び出されるため、ksoap2 と ksoap2-android を使用してさまざまなプラットフォーム用のヘルパー クラスを生成しています。問題は、生成されたクラス/メソッドの 2 つのセットがあり、それらのシグネチャは同等ですが、Java インターフェースをあからさまには共有していないため、メイン コードからそれらを呼び出す方法がわかりません。

簡単な例:

//generated for Android
class A {
  public String sayHi() {
    return "Hi A";
  }
}

//generated for j2se
class B {
  public String sayHi() {
    return "Hi B";
  }
}

//main code - don't know how to do this
XXX talker = TalkerFactory.getInstance()
String greeting = talker.sayHi()

もちろん、最後の部分は疑似コードです。具体的には、コンパイル時にタイプがわからず、特定のインターフェイスに準拠していないオブジェクトのインスタンスで sayHi() を呼び出すにはどうすればよいですか? 生成されたすべてのクラスを手動で編集して「iTalker を実装」を追加することなく、これを行う方法があることを願っています。

4

1 に答える 1

9

簡単な方法は、アダプターを使用することです。

interface Hi {
    void sayHi();
}

public static Hi asHi(final A target) {
    return new Hi() { public void sayHi() { // More concise from Java SE 8...
        target.sayHi();
    }};
}
public static Hi asHi(final B target) {
    return new Hi() { public void sayHi() { // More concise from Java SE 8...
        target.sayHi();
    }};
}

状況によっては、インターフェースをサブクラス化して追加することは可能かもしれませんが、おそらく悪い考えであり、確かに柔軟性が低くなります。

public class HiA extends A implements Hi {
}
public class HiB extends B implements Hi {
}
于 2013-05-30T18:56:25.050 に答える