类型静态属性如何在超类获取?

为啥呢 2012-08-20 04:24:46
需求:在类A中获取继承类A的某个类型的一个静态属性。
如:在猫类中获取某个亚种特有的特征,获取参数只有这个亚种的类型
貌似没办法要求子类有什么静态变量或静态方法,用接口指定非静态的方法又不能体现这个需求的特点,请问有什么比较好的办法进行设计?
...全文
128 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
为啥呢 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:

引用 11 楼 的回复:

引用 10 楼 的回复:

引用 8 楼 的回复:

Java code

package sh.pl;

import java.util.HashMap;
import java.util.Map;

public class A {

private static Map<Class<? ex……
[/Quote]
之前我说过了,我只是希望用静态成员去实现那种要求只有唯一实例的工厂类,因为我认为规定一个类型只有唯一的实例不符合OO思想。
之前我也说过,需求要求实例不是每次都被创建的,有时要从已有的实例中获取,所以已被创建的实例都存在静态集合中。这样就不允许自己new了
scbb 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:

引用 10 楼 的回复:

引用 8 楼 的回复:

Java code

package sh.pl;

import java.util.HashMap;
import java.util.Map;

public class A {

private static Map<Class<? extends A>, A> buff……
[/Quote]

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

况且我觉得每个类都写自己的工厂方法,还要工厂干嘛。。。 自己new呗。
为啥呢 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

引用 8 楼 的回复:

Java code

package sh.pl;

import java.util.HashMap;
import java.util.Map;

public class A {

private static Map<Class<? extends A>, A> buff = new HashMap<Cl……
[/Quote]
并非你写的让我觉得,而是需求本身如此,我之前说过所有的子类都是工厂类,都要有一个静态方法获取这个类型的实例。
scbb 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 8 楼 的回复:

Java code

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>,……
[/Quote]

为什么我这么写,让你觉得每个子类都需要写个静态方法呢?
为啥呢 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

Java code

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 st……
[/Quote]
这样做又回到最初的问题了,每个子类型都需要写一个静态方法,父类型却不能规定子类型这么做,而使用者可能不知道从父类型获取,如果子类型没有这个静态方法就会造成困扰...
scbb 2012-08-20
  • 打赏
  • 举报
回复
上面的代码,同样的类型,第一次为创建。
之后为取静态的变量。。。
scbb 2012-08-20
  • 打赏
  • 举报
回复

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());
}
}

为啥呢 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

Java code

package sh.pl;

public class C extends A {

}



Java code

package sh.pl;

public class B extends A {

}



Java code

package sh.pl;

public class A {

public static A newInst……
[/Quote]
是又不是,实例不是每次都被创建的,有时要从已有的实例中获取,所以已被创建的实例都存在静态集合中。
通常的工厂模式通过规定工厂只有唯一的实例来实现这个需求,我是希望换个思路,用静态成员来实现这个需求。
scbb 2012-08-20
  • 打赏
  • 举报
回复

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());
}
}


猜你是这个意思吧。。。。
为啥呢 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

引用 1 楼 的回复:

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

A a = new B();
然后a访问B的属性??

我希望将父类全部子类的全部实例放在父类中,父类的确不知道有哪些子类,但在调用时可以……
[/Quote]
需求可以说是父类和子类都是工厂类,如果全都放在父类,那无论建立多少个子类,都只使用父类的工厂方法,只需要从父类的静态集合中找到需要的对象,查找的参数就是子类的类型。
Firebirds 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:

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

A a = new B();
然后a访问B的属性??

我希望将父类全部子类的全部实例放在父类中,父类的确不知道有哪些子类,但在调用时可以指定子类作为参数,从父类的静态集……
[/Quote]
为什么要弄个父类的静态集,感觉有点多此一举
为啥呢 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

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

A a = new B();
然后a访问B的属性??
[/Quote]
我希望将父类全部子类的全部实例放在父类中,父类的确不知道有哪些子类,但在调用时可以指定子类作为参数,从父类的静态集合中获取这个子类型的某个实例。
scbb 2012-08-20
  • 打赏
  • 举报
回复
如果你能把你的类结构写得更详细点,就能更容易让大家帮上你了。
scbb 2012-08-20
  • 打赏
  • 举报
回复
设计有问题吧??
父类为什么要知道子类的属性? 居然还是静态的。
父类应该都不知道自己有哪些子类吧。
也许你的意思是??
class A
class B extends A

A a = new B();
然后a访问B的属性??



62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧