我有两个类(我们称它们为A
和B
),它们都从一个共同的超类(C
)继承。在运行时更改类的类型
比方说,我需要建立一个List
C
s。我的问题是,根据C
的构造函数收到的数据,我需要在列表中放入一个A
或B
对象。
有没有办法从C
的构造函数中做到这一点?或者,或者,我该如何解决这个问题?
我有两个类(我们称它们为A
和B
),它们都从一个共同的超类(C
)继承。在运行时更改类的类型
比方说,我需要建立一个List
C
s。我的问题是,根据C
的构造函数收到的数据,我需要在列表中放入一个A
或B
对象。
有没有办法从C
的构造函数中做到这一点?或者,或者,我该如何解决这个问题?
这听起来像是一个使用factory pattern的好地方。基本上,创建一个具有返回类型为C的静态方法的CFactory类。然后,该方法可以决定创建A或B并返回该类。
为什么你需要从C的构造函数中完成它?移动任何逻辑确定哪个类型实例化到别的地方,并在那里创建具体类型?
因为C的构造函数接收到的数据会填充类成员 – 2010-08-05 14:34:41
@klez:你可以在'A'和'B'中创建一个构造函数,它使用'super(arg1,arg2等)'调用C的构造函数' – Powerlord 2010-08-05 14:38:45
@klez:然而,你是决定什么数据进入C的构造函数的人。这不是一个答案。 – 2010-08-05 14:39:12
不可以。您不能从C的构造函数创建A或B对象。
您可以使用C中的静态方法创建A或B,或者可以创建一些工厂类来完成此操作。
这被称为工厂模式。
工厂模式: 简单地说,如果我们有一个超类和正子类,并根据提供的数据,我们不得不返回子类的一个对象,我们使用一个工厂模式。
你的执行将看起来像:
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
有没有办法从C的构造函数做到这一点。你可以创建一个在C工厂方法取决于数据,创建一个A或B收到:
class C {
public final static C newInstance(Object data) {
if (inspect(data)) {
return new A(data);
}
return new B(data);
}
}
一个抽象工厂方法应该可以帮助你哪个决定使用
public abstract class CFactory{
public abstract C createCObject(data...){
if (something) {
return new A();
}else{
return new B();
}
}
}
其中的C实现,那么你可以通过使用抽象工厂方法建立列表...
希望这可以帮到...
这种气味。你可能会遇到这个问题,因为你的课堂设计不太好。通常,一个类不确定它本身是什么类型。可能存在潜在的问题。 – Sjoerd 2010-08-05 14:25:53
@Sjoerd我从来没有接受过正规的班级设计教育,所以你说的可能就是这样。 – 2010-08-05 14:32:09