说我想用Java解决一堆Project Euler问题,而不是给每个问题类一个自己的main
方法的样板,而是继承它并使用一个“ solve”方法。
有没有办法让问题类的名称与解决方案一起打印出来?
我所拥有的:
abstract class Problem {
private static String problemName = ???
public static void main(String[] args) {
// If I could summon an instance of the sub-class then it would be easy
// Problem p = new ... what?
System.out.println(problemName + ": " + solve());
}
abstract static long solve();
// oops, you can't do abstract static in Java :(
}
然后
public class Euler_001 extends Problem {
static long solve() {...}
}
问题是要获取this answer中给出的类名的各种黑客都会返回“问题”,而不是“ Euler_001”。
我想我必须实例化问题类,但是那我该怎么做?
答案 0 :(得分:1)
当父级需要调用子级时,静态上下文无助于继承。将实例与抽象结合使用:
abstract class Problem {
public static void main(String[] args) throws Exception {
Problem problem;
//Now, depending on where the exact problem is specified:
//Class known at compile time
problem = new Euler_001();
//Class passed as parameter
problem = (Problem) Class.forName(args[0]).getConstructor().newInstance();
System.out.println(problem.getProblemName() + ": " + problem.solve());
}
abstract long solve();
abstract String getProblemName();
}
子类将提供一个覆盖抽象方法的常规实现:
class Euler_001 extends Problem {
@Override
long solve() {
return 0;
}
@Override
String getProblemName() {
return "????";
}
}
根据您的配置方法,您可以在父级的main
方法内基于类名创建具体类的实例。
这样,Problem
类可以通过以下方式调用:
java com.mypackage.Problem "com.mypackage.Euler_001"
答案 1 :(得分:0)
静态变量和方法不能被覆盖-它们将被替换。因此,根据我的理解,我们需要创建子类的实例。
我检查了-
问题p =新的Euler_001();
System.out.println(p.getClass()。getSimpleName()); //打印Euler_001