Java 从接口返回抽象类好吗

Java 从接口返回抽象类好吗,java,oop,design-patterns,polymorphism,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、

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

返回一个抽象类没有什么错,尽管建议尽可能多地使用接口。如果您可以将
PQR
作为一个界面,那么就这样做。但如果没有,不用担心

现在有一些类实现了ABC接口。那又怎么样 我应该怎么做才能从x,y,z得到正确的等级


只需确保每个实现
ABC
的类中的
returnRightClass()
的每个实现都返回了
PQR
的正确实例(x、y或z)

编辑

回答你的问题:

public MyClassX implements ABC {

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

}


使用
摘要
接口
获取
返回
值很好

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

比如在某些情况下

PQR myObj = new z();

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

您可以返回一个抽象类。没有关于返回接口或抽象类的法律,这取决于您的软件设计:

返回
x
y
z
的一种方法是使用

示例(伪代码):

如果您不想使用
条件
,那么可以使用a来执行@JVerstry发布的操作

当类实现
ABC
接口时,可以使用传递工厂以供
ABC
实现者使用

示例(伪代码):


希望能有所帮助。

我不知道你的设计思想是什么,但是让你的X、Y、Z类自己实现接口不是更容易吗?您仍然可以在抽象类中放入这三个类可以派生的任何通用代码。总的来说,我认为引用接口比抽象类更好,以防将来需要对其进行调整。只是想一想。

只要确保每个实现ABC的类中的returnRightClass()的每个实现都返回正确的PQR实例a(x、y或z)。我该怎么做呢?最好弄清楚您所说的“万一将来要调整它”是什么意思
public MyClassZ implements ABC {

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

}
PQR myObj = new z();

(myObj instanceof z) // returns true
(myObj instanceof x) // returns false
(myObj instanceof y) // returns false
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;
        }
    }
}
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
}