繁体   English   中英

在Java中扩展主类

[英]Extending the main class in Java

我需要通过覆盖它的一些方法来扩展我的主类的功能。 我期待扩展主类的类能够运行。 但是,Eclipse不会将MyLauncher识别为可运行的类。 在下面的代码中,我有一个由子类重写的setup()方法。 我想要的是一种从超类运行main(..) ,还有从子类运行的设置。

// Launcher.java
public class Launcher {

    Launcher instance;

    public static void main (args[]) {
        instance = new Launcher(); // This is likely the problem
        instance.setup();
    }

    public void setup() {
        System.out.println("Default agent setup.");
    }
}

// MyLauncher.java
public class MyLauncher extends Launcher {

    public void setup() {
        System.out.println("New agent setup!");
    }
}

我接受这个的替代方案。 但是我无法在子类中添加main方法。 Launcher类在我正在制作的API中,因此它不能引用正在使用API​​的类MyLauncher。

编辑:我认为这是针对我的问题。 我决定寻找新的方法。 由于我正在使用JDT,我将解析Launcher并注入该类。

静态方法不是继承的,它们总是绑定到定义它们的类,并且需要明确地调用。

在你的情况下, MyLauncher需要一个main()方法,然后可以委托Launchermain()方法:

public class MyLauncher extends Launcher {

    public static void main (String[] args) {
        Launcher.main(args);
    }

    protected void setup() {
        System.out.println("New agent setup!");
    }
}

无法从外部调用受保护的方法。 所以MyLauncher.setup()不会覆盖Launcher.setup()instance.setup(); 从Class Launcher调用public方法。

项目中只能有一个主要方法,即程序的一个入口点。 因此,我们假设您将在Launcher类中保留main方法。

您的主要方法签名应该是:

public static void main (String args[])

除非你想要调用启动器的setup()方法,否则你想做:

instance = new MyLauncher();

这将从MyLauncher调用setup()方法。

如果要从Launcher类调用setup(),则需要实例化启动器类:

instance = new Launcher();

如果您希望能够运行MyLauncher.setup() ,则该变量必须是MyLauncher 您正在main()函数中初始化并存储Launcher

如果这两个类在同一个包中,或者Launcher.java导入了MyLauncher类,那么Launchermain()函数应该是:

public class Launcher {
    Launcher instance;

    public static void main(String[] args) {
        instance = new MyLauncher();
        if(instance instanceof MyLauncher) {
            ((MyLauncher) instance).setup();
        } else
        {
            instance.setup();
        }
    }
}

正如您所说,直接在main创建Launcher实例的事实意味着没有可用的继承。 即使您可以轻松地从Eclipse启动MyLauncher ,在main方法中您也不会知道实际使用了哪种类型来启动它。 我看不到任何简单的解决方案不涉及任一创建main中的每个类的方法提供类名作为一个命令行参数。 我可能会将“跑步”与其他任何东西分开:

public class Launcher {
    public static void launch(LaunchConfiguration configuration) {
        configuration.setup();
        ...
    }
}

public class LaunchConfiguration {
    public static void main(String[] args) {
        Launcher.launch(new LaunchConfiguration());
    }

    public void setup() {
    }
}

public class MyLaunchConfiguration {
    public static void main(String[] args) {
        Launcher.launch(new MyLaunchConfiguration());
    }

    @Override
    public void setup() {
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM