Статический контекст не помогает наследованию, когда родитель должен вызвать ребенка.Используйте экземпляры с абстракцией:
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"