Java 在运行时更改类类型
我有两个类(我们称它们为Java 在运行时更改类类型,java,Java,我有两个类(我们称它们为A和B),它们都继承自一个公共超类(C) 假设我需要建立一个列表的Cs。我的问题是,根据C的构造函数接收到的数据,我需要在列表中放入A或B对象 有没有办法从C的构造函数内部实现这一点?或者,我该如何解决这个问题呢?这听起来是一个使用智能手机的好地方。基本上,使用返回类型为C的静态方法创建一个类CFactory。然后,该方法可以决定创建a或B并返回该类。为什么需要从C的构造函数内部执行此操作?将决定实例化哪种类型的逻辑移到其他地方,然后在那里创建具体类型?否。不能从C的构造
A
和B
),它们都继承自一个公共超类(C
)
假设我需要建立一个列表的C
s。我的问题是,根据C
的构造函数接收到的数据,我需要在列表中放入A
或B
对象
有没有办法从C
的构造函数内部实现这一点?或者,我该如何解决这个问题呢?这听起来是一个使用智能手机的好地方。基本上,使用返回类型为C的静态方法创建一个类CFactory。然后,该方法可以决定创建a或B并返回该类。为什么需要从C的构造函数内部执行此操作?将决定实例化哪种类型的逻辑移到其他地方,然后在那里创建具体类型?否。不能从C的构造函数创建A或B对象
您可以从C中的静态方法创建A或B。或者,您可以创建一些工厂类来实现这一点。这称为工厂模式
工厂模式:
简单地说,如果我们有一个超类和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
此处的签出示例:
从C的构造函数中无法做到这一点。您可以在C中创建factory方法,该方法根据接收到的数据创建a或B:
class C {
public final static C newInstance(Object data) {
if (inspect(data)) {
return new A(data);
}
return new B(data);
}
}
抽象工厂方法可以帮助您决定使用哪个C实现
public abstract class CFactory{
public abstract C createCObject(data...){
if (something) {
return new A();
}else{
return new B();
}
}
}
然后您可以使用抽象工厂方法构建列表
希望这有帮助……这气味。你可能会面临这个问题,因为你的课堂设计不是很好。通常,类不确定它本身是什么类型。这可能是一个潜在的问题。@Sjoerd我从来没有接受过关于类设计的正式教育,所以你说的可能是这样的。因为C的构造函数接收到的数据将填充整个类members@klez:您可以在a
和B
中创建一个构造函数,使用super调用具有相同签名的C的构造函数(arg1、arg2等)
@klez:但是,你是决定哪些数据进入C的构造函数的人。这不是答案。我的意思是他可以在其他地方调用A()或B()(或C())。下面的工厂模式答案基本上就是我的意思。