2017-07-04 3 views
0

私はオブジェクトXとオブジェクトBを持っていると言います.Xはランダムクラスのオブジェクトで、Bを作成し、オブジェクトBの変数として格納されます。Java - 任意のオブジェクトに対してインタフェースメソッドを呼び出すことはできますか?

オブジェクトBは、それがどのクラスであるか知らずに、オブジェクトXでメソッドを実行する。

任意のオブジェクトでメソッドを呼び出すことは可能ですか?その名前のメソッドが存在する場合は実行し、そうでない場合は実行しません。私はtry/catchがその部分を回避することができると仮定します。それはあまりにもJavaを使用可能であるという考えを持っているので、これはインタフェースを持つことができました、

public class ObjectB { 

    public Object parentX; 

    public ObjectB(Object x) { 
    parentX = x; 
    } 

    public void anyMethod() { 
    x.runMyMethod(); 
    } 
} 

私が一緒に働いていた別のプログラムでは、と:

しかし、私はこのような何かを持って言うことができます。しかし、私はこれを設定する方法を見つけることができないようです。だから、上記の場合、どのように設定され、ObjectBは私のプログラム内のすべてのクラスのメソッドを呼び出すことができます、それは私が望むものでしたか?

+1

でメソッドを呼び出すことができるタイプMyIntfの親にX 'をClass Xのオブジェクト(またはMyIntfを実装するクラス)を割り当てることができますそのインタフェースを実装するクラスのインスタンスでなければなりません。 (そして、あなたは 'parentX'を意味しますか?) –

+1

いいえ、それを行う唯一の方法は反射を使用することですが、反射はほとんどの場合正しい答えではありません。あなたはおそらくあなたのデザインを修正することによってそれを行う必要があります。しかし、あなたが達成したいことが分かっていなくても、より高いレベルでは、答えにくいです。 –

+0

'x'と' parentX'の型として 'Object'の代わりにインタフェースを使います。 –

答えて

1

はい、間違いなく可能です。

インターフェイスMyIntfを定義し、Class Xが実装しています。今、クラスBには `、あなたがそのメソッドを呼び出したい場合は、その親

interface MyIntf 
    { 
     void runMyMethod() 
    } 

    public class ObjectX implements MyIntf { 
      void runMyMethod() 
      { 
      } 
    } 

    public class ObjectB { 

     public MyIntf parentX; 

     public ObjectB(MyIntf x) { 
     parentX = x; 
     } 

     public void anyMethod() { 
     parentX.runMyMethod(); 
     } 
    } 
0

このdocumentationの最後を見ると、キャストに関する情報が表示されます。キャスティングを使用すると、プログラムはオブジェクトが型であると想定し、その中のメソッドを呼び出そうとします。今、Bオブジェクト

public void anyMethod() { 
    ((MethodParentObject) this.x).runMyMethod(); 
} 
2

、それが何であるかを知らなくても、クラス、オブジェクトXでメソッドを実行したいと考えています。

単純に意味がありません。メソッドを呼び出すには、メソッドの名前と期待されるパラメータを知る必要があります。その意味で、クラスBにはある程度の知識が必要です。したがって、あなたは次のようなことをします/

if (parentX instanceof ClassA) { 
((ClassA) parentX) . someAMethod(bla, blub); 
} 
if (parentX instanceof InterfaceC) { 
((InterfaceC) parentX) . someCMethod(bla, blub); 
} 

この意味では、ここでインターフェイスを使用することができます。クラスも同様に機能します。重要なことは、ある情報が必要だということです。さもなければあなたは単に立ち往生しています。

唯一の代替方法はreflectionです。特定のタイプを知る必要はありません。可能であればの検査parentXを使って、そのオブジェクトに対してどのメソッドが呼び出せるか調べます。しかし、反映は、A)進歩した概念であり、b)その使用法が複雑である。

関連する問題