Java:如何重构未知类
我有一个实例化泛型对象的类,它可以是特定类的任何一个子类:Java:如何重构未知类,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我有一个实例化泛型对象的类,它可以是特定类的任何一个子类: abstract class Sport; class Basketball extends Sport { Basketball (Team teamA, Team teamB) { /*set sport rules*/ } } class Soccer extends Sport { Soccer (Team teamA, Team teamB) { /*set sport rules*/ } } class M
abstract class Sport;
class Basketball extends Sport {
Basketball (Team teamA, Team teamB) { /*set sport rules*/ }
}
class Soccer extends Sport {
Soccer (Team teamA, Team teamB) { /*set sport rules*/ }
}
class Match {
Sport s;
Match (Sport y) { this.s = y; }
void playMatch ();
}
我希望能够通过调用方法的构造函数来重置方法中的对象:
void playMatch () {
this.s = new /*class of s*/();
/*do stuff with s*/
}
我该怎么做呢?如果你知道你的s构造函数没有参数,你可以调用:
s.getClass().newInstance()
否则,如果你知道它是构造函数的参数
Constructor ctor = s.getClass().getConstructor(TypeA.class, TypeB.class, etc...);
S sInstance = (S)ctor.newInstance(typeAValue, typeBValue, etc...Value);
否则,您可以使用,它可以生成您需要的任何类型的类,但是请注意,通过使用该方法,您可以在不调用任何构造函数的情况下获得对象,这可能是危险的。您必须告诉objeness手动调用构造函数,但同样,您必须知道它需要的参数
但我不明白你的密码。。。是java还是伪代码
既然你发布了一些真实的代码,我就不建议你使用这个答案。事实上,这是从未知类实例化对象的方法,但在您的情况下,不应该这样做 我建议您在
Sport
类中添加reset()
方法。
使用反射实例化对象是危险的;如果构造函数参数发生更改,则在编译时不会注意到。它在运行时也很慢,尽管现在这不是什么大问题。。。除非你每秒叫它1000次
它还使您能够实现更高版本,以便跟踪运动的状态。还有很多其他的事情会阻止你去做
你真的不应该这样做。你想要
method
根据s
中当前存储的对象类型构造一个对象?super
是一个关键字,你不能用它作为类名……请只发布真实的代码,而不是某种类型的代码。“但我不理解你的代码……是java还是伪代码?”对