2015-06-03 72 views
15

我有一個ICoreClient接口和AClientBClient類實現這一點。java的方法可以根據條件返回值嗎?

ICoreClient向用戶公開。

我需要在ICoreClient界面添加一個新方法。所以,它需要在兩個客戶端實施。我不能使這個方法是通用的,因爲它具有完全不同的簽名但具有相似的功能。

我有2個接口xxyy

ClientA實現xxClientB工具yy

所以,我決定加入ICoreClienttestMethod,將提供我根據客戶xxyy實例。

我想根據條件從單個方法返回這些接口的實例。

ClientA

public xx testMethod(){ 
    return instanceof xx; 
} 

ClientB

public yy testMethod(){ 
    return instanceof yy; 
} 

我應該在ICoreClient接口寫?

public zz testMethod() 

我試圖把一個虛擬接口zz(作爲一個共同的超類型)都xxyy正在實現這一點。但仍然無法在其各自的客戶端公開xxyy的方法,因爲它最終在zz中得到了詳細說明。

這種場景有沒有已知的方法?

編輯:如果我使返回類型Object,這些接口的方法不公開。雖然,對象包含xxyy實例,

用戶仍然需要將它轉換爲(xxyy如何將用戶知道?)使用的接口中的方法。我想揭露ClientX的方法而不必投到ClientAClientB ...

+3

*我要回這些接口*實例 - 你的意思是它擴展這個接口*類的實例* 對? – TheLostMind

+0

你想要做的事對我來說似乎很奇怪。我確信有一個更好的解決方案在這一個... – glglgl

+2

什麼是'return instanceof xx'應該做的?這看起來不像有效的語法。 – coredump

回答

38

編輯後,它看起來像你可能正在尋找generics。你可以讓你的界面類似這樣的

interface ICoreClient<T>{// T will be set by each class implementing this interface 
    T testMethod(); 
} 

和每個類都可以像

class ClientA implements ICoreClient<xx>{ 
    xx testMethod(){ 
     //return xx 
    } 
} 

class ClientB implements ICoreClient<yy>{ 
    yy testMethod(){ 
     //return yy 
    } 
} 
+3

編輯之後,問題改變了很多,這似乎是一個很好的選擇。 +1 –

16

只有在xxyy具有公共超類型(接口或類)時纔有可能。在最壞的情況下,你總是可以返回Object。

public Object testMethod() // or a more specific common super type of `xx` and `yy` 
{  
    if (..some condition..) { 
     return ..instanceof `xx`..; 
    } else if (..other condition..) { 
     return ..instanceof `yy`..; 
    } 
    return null; // or some other default instnace 
} 
+4

'+ l'爲常見的超類型。它幾乎應該是那個或單獨的方法。 –

+3

這個問題是..對象將包含'xx'或'yy'的實例..但用戶仍然需要爲接口中的方法使用類型轉換.. OP需要的是暴露'XClient '不必強制編輯.. –

0

爲返回對象意味着你必須在客戶端投可以轉而返回,其中包含您可能值的自定義對象:

public class MethodResult 
{ 
    private xxx xResult; 
    private yyy yResult; 
    public MethodResult(xxx xResult){ 
     this.xResult=xResult; 
    } 
    public MethodResult(yyy Result){ 
     this.yResult=yResult; 
    } 
    public xxx getXResult(){return xResult;} 
    public yyy getYResult(){return yResult;} 
} 

,然後返回此類型:

public MethodResult testMethod() 
{ 
    if (..some condition..) { 
      return new MethodResult(new xxx()); 
     } else if (..other condition..) { 
      return new MethodResult(new yyy());; 
     } 
    } 
} 

然後客戶端可以檢查哪個結果不爲null,並相應地使用該類型,從而可以訪問xxx或yyy上定義的所有方法,具體取決於設置哪個方法。或者你可以添加一個方法,允許你檢查設置的結果是否做出決定,而不是檢查是否爲空...

相關問題