Java 继承main方法
我想定义一个基类,该基类定义一个实例化该类的主方法,并运行一个方法。不过有几个问题。下面是基类:Java 继承main方法,java,inheritance,main-method,Java,Inheritance,Main Method,我想定义一个基类,该基类定义一个实例化该类的主方法,并运行一个方法。不过有几个问题。下面是基类: public abstract class Strategy { abstract void execute(SoccerRobot robot); public static void main(String args) { Strategy s = new /*Not sure what to put here*/(); s.execut
public abstract class Strategy
{
abstract void execute(SoccerRobot robot);
public static void main(String args)
{
Strategy s = new /*Not sure what to put here*/();
s.execute(new SoccerRobot())
}
}
下面是一个示例派生类:
public class UselessStrategy
{
void execute(SoccerRobot robot)
{
System.out.println("I'm useless")
}
}
它定义了一个简单的execute方法,当作为主应用程序的一个函数使用时,应该在主方法中调用该方法。然而,为了做到这一点,我需要在基类的主方法中实例化派生类。这似乎是不可能的
我不希望对每个派生类都重复main方法,因为它感觉有些不必要
有没有正确的方法可以做到这一点?您不能实例化一个抽象类,但肯定可以从基类实例化一个派生类。所以只需从类定义中删除抽象
public class UselessStrategy
做
Strategy s = new UselessStrategy();
将main方法移出到一个单独的类中。独立关注点
战略(名称说明一切)
启动器(将组件组装在一起并触发执行) 静态方法(如“main”)不是继承的,而是可以直接调用的。作为一种解决方法,您可以将类名参数化为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();
}
private static Map从哪里调用主方法?如果它需要参数,那么您可以根据这些参数决定具体的策略,实例化该策略类并对其调用execute
方法
将您希望执行的代码放在其他地方,最好是一个非静态方法,然后调用它main()
不应以这种方式使用
我建议创建一个单独的策略类来代替main。您可以在子类的静态块中定义该类
public abstract class Strategy
{
protected static Class<? extends Strategy> instanceClass;
abstract void execute(SoccerRobot robot);
public static void main(String args)
{
Strategy s = instanceClass.newInstance()
s.execute(new SoccerRobot())
}
}
你的设计似乎有点落后。用特定的策略实例化一个SoccerRobot
不是更有意义吗?SoccerRobot代表机器人的物理属性,而不是应用程序本身。它提供机器人的高级控制(navigateTo、GetBalangle等)。所以我认为它不应该采取这种策略。第一个错误是复制粘贴操作。如果我要从Strategy派生另一个类,比如说有用的Strategy
,我希望基类的main方法能够工作。我希望main方法知道它是从哪个类调用的,并实例化所述类。基类的main方法与任何其他静态方法一样,不“工作”于任何派生类,只“工作”于自身。但是由于人们已经发明了命令行参数,所以在您的案例中不需要有多个主要方法。使用参数作为工厂创建策略的输入。Class.forName
在我的平台上是不允许的。Class.forName
不是必需的,还有其他方法可以将参数向量传递的键映射到具体的类。这是像J2ME或android这样的特殊Java风格吗?还是有一个限制性的SecurityManager?一些特殊的java风格,确切地说,嗯,你应该在问题中加上这个名字,也许还有一个标签;它似乎是一个专门的Java实现。执行程序时调用main
方法。将编译UselessStrategy
类,该类有望调用Strategy
中的main
方法
public abstract class Strategy
{
protected static Class<? extends Strategy> instanceClass;
abstract void execute(SoccerRobot robot);
public static void main(String args)
{
Strategy s = instanceClass.newInstance()
s.execute(new SoccerRobot())
}
}
public class UselessStrategy extends Strategy
{
static {
instanceClass = UselessStrategy.class;
}
void execute(SoccerRobot robot)
{
System.out.println("I'm useless")
}
}