2017-06-29 35 views
0

假設我有以下接口如何傳遞給類的接口可以調用該類的方法?

public interface I { 
    public int evaluate(); 
} 

和以下類

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

然後,我可以有I使得

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

在其中實施呼叫的實現類A的方法?

我知道反射,但我想知道靜態技術。
謝謝

+0

你有模型和我之間的關係,但我和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

簡單的答案是否定的。另外,這看起來像緊密耦合,因爲接口必須知道它被注入的類。

你可能想要做的是參數化的evaluate方法及其實現與int,所以你可以在A類調​​用時把它作爲getX(),然後通過1Model類的evaluate實現遞增。

編輯

至於建議的Andy Thomas,你可能要furtherly一概而論。

而不是參數evaluateint,您可以通過聲明int getX()方法(其中A隨後將實現)的接口參數化它。

反過來,A將調用model.evaluate(this)Modelevaluate實施將變成類似return myGivenArgument.getX() + 1

由您來決定是否有必要根據上下文。

+2

真正的答案是肯定的,並且將類的實例作爲參數傳遞給接口方法很簡單。 –

+1

@AndyThomas同意這是一個更好的通用解決方案,儘管它可能會變得有點矯枉過正。你需要一個接口來聲明'A'實現的getX,然後聲明'evaluate(MyNewInterface foo)'。 – Mena

+1

@AndyThomas如果你傳遞具體類作爲參數,應該考慮甚至使用接口的原因。如果你緊密結合,界面就會變得過時,而且功能也可能在課堂上實現。爲了防止我建議使用兩個接口,我們將其稱爲L由類A實現,而第二個接口我期望接口L作爲其函數的參數。 – Endzeit

相關問題