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())。下面的工厂模式答案基本上就是我的意思。