我有两个类(让我们称之为A
和B
),这两个类都继承自一个公共超类(C
)。
假设我需要构建一个List
C
s。我的问题是,根据C
的构造函数收到的数据,我需要在列表中放置一个A
或B
对象。
有没有办法从C
的构造函数中执行此操作?或者,或者,我该如何解决这个问题?
答案 0 :(得分:7)
这听起来像是使用factory pattern的好地方。基本上,使用返回类型为C的静态方法创建一个类CFactory。然后,该方法可以决定创建A或B并返回该值。
答案 1 :(得分:3)
这称为工厂模式。
工厂模式: 简单来说,如果我们有一个超类和n个子类,并且基于提供的数据,我们必须返回其中一个子类的对象,我们使用工厂模式。
您的实施将类似于:
public class C {
//methods
}// End of class
public class A extends C {
//methods
}// End of class
public class B extends C {
//methods
}// End of class
public class CFactory {
public static void main(String args[]) {
CFactory factory = new CFactory();
factory.getObjects(args[0]);
}
public C getObjects(String type) {
if (type.equals("A"))
return new A();
else if(type.equals("B"))
return new B();
else
return null;
}
}// End of class
结帐示例:
http://www.allapplabs.com/java_design_patterns/factory_pattern.htm
答案 2 :(得分:3)
C的构造函数无法做到这一点。您可以在C中创建一个工厂方法,根据收到的数据创建A或B:
class C {
public final static C newInstance(Object data) {
if (inspect(data)) {
return new A(data);
}
return new B(data);
}
}
答案 3 :(得分:1)
为什么需要在C的构造函数中执行此操作?移动任何逻辑确定哪个类型实例化到其他地方,然后在那里创建具体类型?
答案 4 :(得分:1)
抽象工厂方法应该可以帮助您决定使用哪个C实现
public abstract class CFactory{
public abstract C createCObject(data...){
if (something) {
return new A();
}else{
return new B();
}
}
}
然后您可以使用抽象工厂方法构建List ...
希望这有助于......答案 5 :(得分:0)
没有。您无法从C的构造函数创建A或B对象。
您可以在C中使用静态方法创建A或B.或者,您可以创建一些工具类来执行此操作。