Java 从接口返回抽象类好吗
我有一个名为ABC的接口。我还有一个抽象类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、
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
}