2011-07-18 31 views
2

我有一個名爲ABC的接口。我也有一個抽象類PQR,並且有3個類擴展了這個抽象類。從接口返回抽象類是否很好

例如:

abstract class PQR { 
    //... 
} 

interface ABC { 
    //other methods.... 
    PQR returnRightClass(); 
} 

class X extends PQR { 
} 

class Y extends PQR { 
} 

class Z extends PQR { 
} 

現在有哪些實現ABC接口的類。那麼我應該怎麼做才能從X,Y和Z獲得正確的課程?

回答

2

返回抽象類沒什麼問題,儘管建議儘可能使用接口。如果你可以使PQR成爲一個界面,那就這樣做。但如果不是,不用擔心。

現在有類實現ABC接口。那麼,我應該怎樣做才能從x,y,z獲得正確的課程?

只是要在每個班級實施ABC回報PQR(X,Y或Z)的合適的實例肯定returnRightClass()每個實現。

編輯

要回答你的問題:

public MyClassX implements ABC { 

    public PQR returnRightClass() { 
     return new x(); 
    } 

} 

或者

public MyClassY implements ABC { 

    public PQR returnRightClass() { 
     return new y(); 
    } 

} 

或者

public MyClassZ implements ABC { 

    public PQR returnRightClass() { 
     return new z(); 
    } 

} 
+0

只要確保在實現ABC的每個類中的returnRightClass()的每個實現都返回PQR(x,y或z)的正確實例。我該如何做到這一點 –

+0

ohh yes ...是個白癡...... –

+0

@Saurabh請參閱編輯我的答案 – JVerstry

1

其良好的使用對於return值爲或interface

您可以使用instanceof運算符進行類型匹配。

像在某些情況下

PQR myObj = new z(); 

(myObj instanceof z) // returns true 
(myObj instanceof x) // returns false 
(myObj instanceof y) // returns false 
2

您可以返回一個抽象類。有沒有關於返回接口或抽象類的法律,它取決於你的軟件設計:

一種方式來回報您的xyz是使用Factory Pattern

例(僞):

public class PQRFactory { 

    public PQR getPQR(condition) { 

     switch (condition) { 
      case condition_x : 
       return new x(); 
      break; 

      case condition_y : 
       return new y(); 
      break; 

      case condition_z : 
       return new z(); 
      break; 

      default : return null; 
     } 
    } 
} 

如果你不想使用condition那麼你可以使用一個Builder pattern做什麼@JVerstry公佈。

當您的課程實施ABC界面時,您可以使用Strategy pattern通過工廠供ABC實施人員使用。

例(僞):

public abstract class AbstractABC implements ABC { 

    protected PQRFactory factory; 

    protected AbstractABC() { 
     factory = new PQRFactory(); 
    } 

    protected AbstractABC(PQRFactory factory) { 
     this.factory = factory; 
    } 

} 

public class ABCImpl1 extends AbstractABC() { 

    //Override constructors needed to construct this class 
} 

希望這有助於。

1

我不確定你背後的設計思路是什麼,但是讓X,Y,Z類實現接口本身更簡單嗎?你仍然可以在你的抽象類中加入任何通用的代碼,三者可以從中派生出來。一般來說,我認爲引用接口和抽象類更好,以防將來調整它。只是一個想法。