需求:在类A中获取继承类A的某个类型的一个静态属性。
如:在猫类中获取某个亚种特有的特征,获取参数只有这个亚种的类型
貌似没办法要求子类有什么静态变量或静态方法,用接口指定非静态的方法又不能体现这个需求的特点,请问有什么比较好的办法进行设计?
如:在猫类中获取某个亚种特有的特征,获取参数只有这个亚种的类型
貌似没办法要求子类有什么静态变量或静态方法,用接口指定非静态的方法又不能体现这个需求的特点,请问有什么比较好的办法进行设计?
父类为什么要知道子类的属性? 居然还是静态的。
父类应该都不知道自己有哪些子类吧。
也许你的意思是??
class A
class B extends AA a = new B();
然后a访问B的属性??
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());
}
}
猜你是这个意思吧。
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());
}
}
能不能把最基本的需求说下呢? 我指业务逻辑。 (难道是课后作业?不是解决实际问题的?)
需求不可能是要你们写几个子类,然后包含工厂方法吧?况且我觉得每个类都写自己的工厂方法,还要工厂干嘛 自己new呗。
之前我也说过,需求要求实例不是每次都被创建的,有时要从已有的实例中获取,所以已被创建的实例都存在静态集合中。这样就不允许自己new了