我想制作一个方便的超级类,它将创建从哪个子类运行的实例,而不必硬编码子类的名称。做这件事最快的方法是什么?
我们可以假设子类的构造函数将具有相同的签名,例如没有参数。
class Main {
public static void main (String [] args) {
Main m = new NAME-OF-SUBCLASS();
}
}
class MainSub1 extends Main { /*...*/ }
class MainSub2 extends Main { /*...*/ }
因此,当从MainSub1调用main(从命令行调用$ java MainSub1
)时,会创建一个MainSub1对象,等等。
在我写这篇文章的时候,我发现了这个线索,公认的答案说这是不可能的,但它当然可以,以某种方式,通过反思或其他什么,对吧?
我并不是真的推荐它,但它有一个肮脏的技巧:
class Main {
static Main m;
public static void main (String [] args) {
// use m
}
}
class MainSub1 extends Main { static { m = new MainSub1(); } }
class MainSub2 extends Main { static { m = new MainSub2(); } }
一个严肃的答案是为每个子类编写一个单独的main
,但让它调用一个接受适当实例的通用继承方法。