2017-06-29 14 views
0

Iは、その後、私はIそのような実装が呼び出しされたインターフェイスがクラスに渡されると、そのクラスのメソッドを呼び出すことができますか?

class Model implements I { 
    @Override 
    public int evaluate() { 
     return getX() + 1; 
    } 
} 

その実装を持つことができ、以下のインターフェース

public interface I { 
    public int evaluate(); 
} 

と、次のクラス

public class A { 
    // ... 
    public int getX(){} 
    public int evaluateX(I model){ 
     return model.evaluate(); 
    } 
} 

があるとクラスAのメソッド?

私はReflectionについて知っていますが、静的な手法について知りたいと思います。
ありがとうございます

+0

ModelとIの関係はありますが、IとgetXの関係はどこにありますか? – Dakoda

+0

私はリフレクションを使う以外の方法はないと思います。モデルの関数を呼び出すすべてのクラスが関数を実装する必要はないという事実について考える必要があります。なぜ、クラスAに代わりにインターフェイスを実装させるのはなぜですか? – Endzeit

+0

意味のある名前は、あなたがしようとしていることを理解するのに役立ちます。インタフェースメソッドI.evaluate()が 'A.getX()'を呼び出すようにするには、Aオブジェクトを 'I.evaluate()'に渡します。 'class I {public int evaluate(A myA); } '。オプションで、Aオブジェクトをインタフェース型として渡して、I.evaluate()が複数の定義で動作できるようにすることもできます。 'class I {public int evaluate(IX myX); } '。 –

答えて

1

なぜlmbdasを使用しないのですか?あなたの例が良い候補者のように見えます。

public interface I { 
    public int evaluate(Supplier<Integer> s); 
} 

public static class A { 

    public int getX(){return 5;} 

    public int evaluateX(I model){ 

     return model.evaluate(() -> getX()); 
    } 
} 

public static class Model implements I { 

    @Override 
    public int evaluate(Supplier<Integer> s) { 
     return s.get() + 1; 
    } 
} 
3

簡単な回答はありません。

また、インタフェースが注入されているクラスを知る必要があるため、これは密結合のように見えます。あなたがやりたいことは何

はクラスAに呼び出すときに、あなたがgetX()としてそれを渡すことができるようにあなたのModelクラスのevaluate実装で1インクリメントその後、intevaluate方法とその実装をパラメータです。

編集

Andy Thomasによって示唆されるように、あなたはfurtherly一般化することもできます。 int

代わりのパラメータ化evaluate、あなたは(Aがその後実装し)int getX()メソッドを宣言するインターフェースでそれをパラメータ化できます。

ターンでは、Amodel.evaluate(this)を呼び出します、とModelevaluate実装はreturn myGivenArgument.getX() + 1のようなものに変更します。

これはコンテキストに基づいて必要かどうかを決定するまでにします。

+2

実際の答えはyesです。クラスのインスタンスを引数としてインターフェイスメソッドに渡すと簡単です。 –

+1

@AndyThomasはこれがより一般化された解決策であることに同意しましたが、それは少し過度のものに変わる可能性があります。 'A'が実装する' getX'を宣言し、 'evaluate(MyNewInterface foo)'を宣言する必要があります。 – Mena

+1

@AndyThomas具体的なクラスを引数として渡す場合は、インターフェイスを使用してもその理由を考える必要があります。そのようにしっかりと結合していれば、インタフェースは単に時代遅れになり、その機能もクラスに実装される可能性があります。代わりに2つのインターフェイスを使用することを推奨するのを防ぐために、クラスAによって実装されるLと、インターフェイスLがその関数の引数として期待する2番目のインターフェイスを呼びます。 – Endzeit

関連する問題