代码之家  ›  专栏  ›  技术社区  ›  Federico klez Culloca

在运行时更改类类型

  •  2
  • Federico klez Culloca  · 技术社区  · 14 年前

    我有两个班(我们叫他们 A B )都继承自一个公共超类( C )

    假设我需要建立一个 List 属于 C 我的问题是,这取决于 C 的构造函数我需要 列表中的对象。

    有从里面做这个的方法吗 C 的构造函数?或者,我如何解决这个问题?

    6 回复  |  直到 14 年前
        1
  •  7
  •   Kiersten Arnold    14 年前

    这听起来是个好地方 factory pattern . 基本上,使用返回类型为C的静态方法创建一个类cfactory。然后该方法可以决定创建a或b并返回它。

        2
  •  3
  •   rsp    14 年前

    从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
  •  3
  •   YoK    14 年前

    这就是所谓的工厂模式。

    工厂模式: 简单来说,如果我们有一个超类和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

        4
  •  1
  •   hvgotcodes    14 年前

    为什么您需要从C的构造函数内部完成这项工作?移动任何逻辑来决定将哪个类型实例化到其他地方,然后在那里创建具体的类型?

        5
  •  1
  •   fasseg    14 年前

    抽象工厂方法应该帮助您决定使用C的哪个实现

    public abstract class CFactory{
        public abstract C createCObject(data...){
            if (something) {
                 return new A();
            }else{
                return new B();
            }
        }
    }
    

    然后您可以使用抽象工厂方法构建列表…

    希望这有帮助…

        6
  •  0
  •   Sjoerd    14 年前

    不可以。不能从C的构造函数创建A或B对象。

    您可以从C中的静态方法创建A或B,或者,您可以创建一些这样做的工厂类。