0

2 つのインターフェイスを実装する抽象クラスがあります。私は 2 つのインターフェイスを使用しているため、どちらのインターフェイスを使用しても動的バインディングを実装できないのでしょうか? 理由は、インターフェイスの 1 つを使用する場合、明らかに、他のインターフェイスからメソッドを呼び出すことができないためです。なぜなら、型システムでは、サブタイプが多態変数の宣言に使用したインターフェイスによって定義されたメソッドを呼び出すことしかできないからです。

したがって、私の実際の質問は、抽象クラス (またはサブクラス) がメソッドの実装を確実に提供するようにするために、実際にインターフェイスのみを使用していることで問題ありませんか? これは、項目 19 が述べていることと矛盾しているようです。型にはインターフェイスのみを使用する必要があります (私はそれをポリモーフィズムを意味するものと考えました)。

例:

public interface A{
    public void meth1();
}

public interface B{
    public void meth2();
}

public abstract class C implements A,B{

}

public void DynamicBinding(A aobject){
  //Can only call aobject.meth1();
}
4

3 に答える 3

5

ジェネリックスを使用して、メソッドに型 A と B の両方のパラメーターを持たせることができます。

public <T extends A & B> void method(T param) {
  param.meth1(); // fine
  param.meth2(); // also fine
}

関連する質問はこちら

于 2012-07-28T22:43:18.943 に答える
1

メソッドが必要な場合AA、説明したようにオブジェクトのタイプとして使用できます。についても同様ですB。両方のメソッドが必要な場合は、新しいインターフェイスを作成します。

public interface C extends A, B {
}

extendインターフェイスは、複数のインターフェイスに対して許可されます。

次に、必要に応じて、デフォルトの実装で抽象クラスを追加できます。

public abstract class D implements C {
  // implementation details
}
于 2012-07-28T22:39:05.573 に答える
0

あなたができる

public void DynamicBinding(C cobject){
  c.meth1();
  c.meth2();
}

または少し悪いバリアント

public void DynamicBinding(A aobject){
if(aobject instanceof C)
      {
          C myC=(C)aobject;
          myC.meth1();
          myC.meth2();

      }
}

とにかく、私は Jorn がうまくやった方が好きです。

于 2012-07-28T22:57:35.097 に答える