繁体   English   中英

从接口返回抽象 class 是否很好

[英]Is it good to return a Abstract class from a Interface

我有一个名为ABC的界面。 我还有一个抽象的 class PQR ,并且有 3 个类扩展了这个抽象的 class。

例如:

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 获得正确的 class?

返回一个抽象的 class 并没有错,但建议尽可能使用接口。 如果您可以使PQR成为接口,那么就这样做。 但如果没有,不用担心。

现在有实现ABC接口的类。 那么我应该怎么做才能从 x,y,z 获得正确的 class 呢?

只需确保每个实现ABC的 class 中的每个returnRightClass()实现都返回一个正确的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();
    }

}

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

返回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 模式来执行 @JVerstry 发布的内容。

当您的类实现ABC接口时,您可以使用策略模式来传递工厂以供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
}

希望这有帮助。

使用abstractinterface作为return值很好。

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

就像在某些情况下

PQR myObj = new z();

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

我不确定您背后的设计理念是什么,但是让您的 X、Y、Z 类实现接口本身不是更容易吗? 您仍然可以将任何通用代码放入您的抽象 class 中,这三个可以从中派生。 一般来说,我认为引用接口比抽象类更好,以防您将来想调整它。 只是一个想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM