2011-07-18 26 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类实现接口本身更简单吗?你仍然可以在你的抽象类中加入任何通用的代码,三者可以从中派生出来。一般来说,我认为引用接口和抽象类更好,以防将来调整它。只是一个想法。