需求:在类A中获取继承类A的某个类型的一个静态属性。
如:在猫类中获取某个亚种特有的特征,获取参数只有这个亚种的类型
貌似没办法要求子类有什么静态变量或静态方法,用接口指定非静态的方法又不能体现这个需求的特点,请问有什么比较好的办法进行设计?

解决方案 »

  1.   

    设计有问题吧??
    父类为什么要知道子类的属性? 居然还是静态的。
    父类应该都不知道自己有哪些子类吧。
    也许你的意思是??
    class A
    class B extends AA a = new B();
    然后a访问B的属性??
      

  2.   


    package sh.pl;public class C extends A {}package sh.pl;public class B extends A {}package sh.pl;public class A { public static A newInstance(Class<? extends A> clazz) {
    try {
    return clazz.newInstance();
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }

    public static A newInstance(String className) {
    A ret = null;
    try {
    ret = (A)Class.forName(className).newInstance();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return ret;
    }

    public static void main(String[] args) {
    A a = A.newInstance(C.class);
    System.out.println("I am " + a.getClass().getName());
    a = A.newInstance("sh.pl.B");
    System.out.println("I am " + a.getClass().getName());
    }
    }
    猜你是这个意思吧。
      

  3.   


    package sh.pl;import java.util.HashMap;
    import java.util.Map;public class A { private static Map<Class<? extends A>, A> buff = new HashMap<Class<? extends A>, A>();
    public static A newInstance(Class<? extends A> clazz) {
    A ret = null;
    try {
    ret = buff.get(clazz);
    if (ret == null) {
    ret = clazz.newInstance();
    buff.put(clazz, ret);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return ret;
    }

    @SuppressWarnings("unchecked")
    public static A newInstance(String className) {
    A ret = null;
    try {
    Class<?> clazz = Class.forName(className);
    if (A.class.isAssignableFrom(clazz)) {
    ret = newInstance((Class<? extends A>)clazz);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return ret;
    }

    public static void main(String[] args) {
    A a = A.newInstance(C.class);
    System.out.println("I am " + a.getClass().getName());
    a = A.newInstance("sh.pl.B");
    System.out.println("I am " + a.getClass().getName());
    }
    }
      

  4.   


    能不能把最基本的需求说下呢? 我指业务逻辑。 (难道是课后作业?不是解决实际问题的?) 
    需求不可能是要你们写几个子类,然后包含工厂方法吧?况且我觉得每个类都写自己的工厂方法,还要工厂干嘛 自己new呗。
      

  5.   

    之前我说过了,我只是希望用静态成员去实现那种要求只有唯一实例的工厂类,因为我认为规定一个类型只有唯一的实例不符合OO思想。
    之前我也说过,需求要求实例不是每次都被创建的,有时要从已有的实例中获取,所以已被创建的实例都存在静态集合中。这样就不允许自己new了