[英]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。 关于返回接口或抽象类没有法律规定,这取决于您的软件设计:
返回x
、 y
、 z
的一种方法是使用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
}
希望这有帮助。
使用abstract
或interface
作为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.