我有一个名为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中获得正确的类?
答案 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)
您可以返回一个抽象类。返回接口或抽象类没有规律,这取决于你的软件设计:
退回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 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
值使用interface
或return
很有用。
您可以使用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类实现接口本身会不会更容易?你仍然可以在你的抽象类中放置任何公共代码,三者可以从中派生出来。一般来说,我认为最好引用接口然后引用抽象类,以防将来要调整它。只是一个想法。