Статические методы, такие как "main", не наследуются, но могут вызываться напрямую. В качестве обходного пути вы можете параметризовать имя класса в качестве аргумента основного метода:
public static void main(String args) throws Exception
{
String className = (args.length > 0) ? args[0] : 'UselessStrategy';
Strategy s = (Strategy) Class.forName(className).newInstance();
s.execute(new SoccerRobot())
}
Если Class.forName
невозможно, то поддержание отображения имен классов может обеспечить таблицу поиска, согласно комментарию Andreas_D:
private static Map<String, Class<? extends Strategy>> STRATEGY_NAME =
new HashMap<String, Class<? extends Strategy>>();
static {
STRATEGY_NAME.put("Useless", UselessStrategy.class);
STRATEGY_NAME.put("Better", BetterStrategy.class);
}
public static void main(String args[]) throws Exception {
String className = (args.length > 0) ? args[0] : null;
Class<? extends Strategy> klass = STRATEGY_NAME.get(className);
if (klass == null) klass = UselessStrategy.class;
Strategy s = klass.newInstance();
s.execute();
}
Могут быть разработаны автоматизированные методы для поддержки отображения, такие как использование отражения, если возникнет такая необходимость.