3

複数のインターフェイスと、それらすべてを実装するクラスがあります。実装クラスのインスタンスでこれらのインターフェイスで定義されたすべてのメソッドを呼び出したいのですが、変数をクラス型として宣言したくないので、まだインターフェイスにプログラミングしています。

次のいずれかを行う必要があるようです。

  1. オブジェクトをあるインターフェイス タイプから別のインターフェイス タイプにキャストして、適切なメソッドを呼び出します。
  2. 他のものを拡張するユニオン インターフェイスを作成し、その型の変数を宣言します。

1 はタイプ セーフではなく、2 はそれ自体に何も追加しない多くの「ユニオン」インターフェイスですぐに終了することを意味するため、これらのいずれも実行しないことをお勧めします。次のようなものを持つことは可能ですか:

public interface A {
    public void doThis();
}

public interface B {
    public void doThat();
}

public class C implements A, B {
    public void doThis(){;}
    public void doThat(){;}
}


//Fake calling code:
public void go() {
    A,B dualTypedInstance = new C(); //
    dualTypedInstance.doThis();
    dualTypedInstance.doThat();

}

これは本当に可能であるように思われます。ありがとう。

4

6 に答える 6

2

あなたはこれを行うことができます:

ImplementsInterfaces impl = new ImplementsInterfaces();
A a = impl;
B b = impl;
于 2013-04-13T09:03:17.240 に答える
1

2019 年にこれを行うことが完全に不可能というわけではありませんが、実稼働コードでのソリューションを必ずしも推奨するわけではありません。また、オブジェクトが不変でなければならないという警告も伴います。たとえば、それぞれメソッド A() とメソッド B() を持つ InterfaceA と InterfaceB を実装するインスタンス変数を効果的に持つクラスを作成するには、次のようにします。

public interface MyInterface {
  public void methodA();
  public void methodB();

  public static <O extends InterfaceA & InterfaceB> MyInterface of(O obj){
      return new MyInterface(){
          public void methodA(){
               obj.methodA();
          }

          public void methodB(){
               obj.methodB();
          }
      };
  }

これにより、依存関係の特定の実装を要求することなく、InterfaceA および InterfaceB 型の final インスタンス変数を効果的に持つ匿名の内部クラスが作成されます。

于 2019-11-29T00:53:44.867 に答える
0

1 つの代替方法は、抽象スーパー クラスを作成することです。

public abstract class AbstractAB implements A, B {
}

public class C extends AbstractAB {
    public void doThis(){;}
    public void doThat(){;}

}

public void go() {
    AbstractAB dualTypedInstance = new C();
    dualTypedInstance.doThis();
    dualTypedInstance.doThat();
}
于 2013-04-13T09:09:16.483 に答える
0

(a) と (b) を実装するクラス (c) をインスタンス化してみませんか?

これを行う別の方法は、(a) と (b) から抽象クラスを作成し、2 つの抽象メソッド (既に持っているようにそれぞれに 1 つずつ) を持ち、クラス (c) を作成してから (の代わりに) 拡張することです。実装) 他のクラス。

于 2013-04-13T08:58:19.967 に答える