我试图添加让我们说5个类,它们都扩展了一个General类,并以不同的方式实现init()
方法。
我需要的是一种存储这些类的方法,同时将该类的一些机会传递给"发生"
为此,我创建了一个类持有者:
public class ClassHolder {
private Class<? extends GeneralOutcome> holdClass;
private int chances;
public ClassHolder(Class<? extends GeneralOutcome> holdClass, int chances) {
super();
this.holdClass = holdClass;
this.chances = chances;
}
public Class<? extends GeneralOutcome> getHoldClass() {
return holdClass;
}
public void setHoldClass(Class<? extends GeneralOutcome> holdClass) {
this.holdClass = holdClass;
}
public int getChances() {
return chances;
}
public void setChances(int chances) {
this.chances = chances;
}
}
还有一个GeneralOutcome类,它将添加到列表中的那些类:
public class GeneralOutcome {
public void init(String text, int times) {
}
}
以及我将它们添加到列表中的方式:
public class Randomizer {
private static List<ClassHolder> myList = new ArrayList<ClassHolder>();
private static ClassHolder outcome01 = new ClassHolder(Outcome01.class, 10);
private static ClassHolder outcome02 = new ClassHolder(Outcome02.class, 10);
private static ClassHolder outcome03 = new ClassHolder(Outcome03.class, 10);
private static ClassHolder outcome04 = new ClassHolder(Outcome04.class, 10);
private static ClassHolder outcome05 = new ClassHolder(Outcome05.class, 10);
public static void main(String[] args) {
for(int i = 0; i < outcome01.getChances(); i++) {
myList.add(outcome01);
}
for(int i = 0; i < outcome02.getChances(); i++) {
myList.add(outcome02);
}
for(int i = 0; i < outcome03.getChances(); i++) {
myList.add(outcome03);
}
for(int i = 0; i < outcome04.getChances(); i++) {
myList.add(outcome04);
}
for(int i = 0; i < outcome05.getChances(); i++) {
myList.add(outcome05);
}
System.out.println(myList.size());
int rand = (int) (Math.random() * myList.size());
System.out.println(rand);
ClassHolder theHoldClass = myList.get(rand);
System.out.println(theHoldClass.getHoldClass());
Class<? extends GeneralOutcome> theOutcome = theHoldClass.getHoldClass();
theOutcome.init();
}
}
问题在于我无法(不知道真的如何)回到GeneralOutcome
我可以访问.init()
方法。
我得到方法init()
未定义类型Class<capture#3-of ? extends GeneralOutcome>
我知道这不是最好的方法。所以我对两者都持开放态度,这是对此的解决方法,也是实现这一目标的更好方法。
答案 0 :(得分:2)
由于某些原因,您在这里尝试做的事情并不起作用。
首先,你的init方法不是静态的。那个电话
Class<? extends GeneralOutcome> theOutcome = theHoldClass.getHoldClass();
theOutcome.init();
直接导致编译时错误。
但是,整个设计看起来很奇怪。首先持有 Class 对象有什么意义?
为什么不创建界面
public interface OutcomeFunctionality {
public void foo(String text, int times);
}
以后实例化实现该接口的任何类的对象?这样你最终可以处理这些对象的列表(以及这些概率)?
[我故意使用名称 foo :单独使用奇怪的名字&#34; init&#34;让你很清楚你的代码打算做什么!从这个意义上说,你应该重新思考你的设计,并找到更好的方法名称来表达这些方法将要做的事情! ]
长话短说:使用/持有类对象并不能在示例代码中为您购买任何内容 - 它只会增加复杂性。所以我的建议是:开始在那里工作并摆脱那个&绕组&#34;。您可能还想阅读Open/Closed principle - 这可以为您提供一些指导如何使用抽象类/子类化来分割&#34;行为&#34;在基类和派生类之间。