从接口返回Abstract类是否合适?

时间:2011-07-18 11:48:53

标签: java oop design-patterns polymorphism

我有一个名为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中获得正确的类?

4 个答案:

答案 0 :(得分:2)

返回抽象类没有任何问题,但建议尽可能使用接口。如果您可以使PQR成为一个界面,那么就这样做。但如果没有,不用担心。

  

现在有一些类实现了ABC接口。所以呢   我应该从x,y,z获得正确的课程吗?

确保实现returnRightClass()的每个类中ABC的每个实现都返回PQR(x,y或z)的正确实例。

修改

回答你的问题:

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();
    }

}

答案 1 :(得分: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
}

希望得到这个帮助。

答案 2 :(得分:1)

abstract值使用interfacereturn很有用。

您可以使用instanceof运算符进行类型匹配。

在某些情况下

PQR myObj = new z();

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

答案 3 :(得分:1)

我不确定你背后的设计理念是什么,但是让你的X,Y,Z类实现接口本身会不会更容易?你仍然可以在你的抽象类中放置任何公共代码,三者可以从中派生出来。一般来说,我认为最好引用接口然后引用抽象类,以防将来要调整它。只是一个想法。