Java中的覆盖接口方法

时间:2018-09-28 13:04:26

标签: java javafx methods interface override

我正在尝试使用现有程序包在其上创建自己的应用程序。但是我不知道如何调用接口参数化方法。

在使用JavaFX的软件包上,有一个构造函数为

的类
public class App extends Application{
...
protected App(Logic logic) {
    this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic));
}
}

界面是这样的:

public interface Logic extends X, Y {

default Configuration configuration() {
    return new Configuration(1000, "Hello world", true);
}
default void initialize() {
    System.out.println("Starting the application.");
}
}

配置如下:

public final class Configuration {
public final int tick;
public final String name;
public final boolean welcomeScreen;

public Configuration(int tick, String name, boolean welcomeScreen) {
    this.tick = tick;
    this.name = name;
    this.welcomeScreen = welcomeScreen;
}
}

App的输出:

 (1000, "Hello world", true)

现在,当我创建自己的App扩展时,覆盖不会通过:

public class Test extends App implements Logic{  
@Override
public Configuration configuration() {
    return new Configuration(25, "Test", true);
}

public static void main(String[] args) {

launch(args); //launches the App
}

}

输出:

(1000, "Hello world", true)

该应用程序仍会调用该界面的默认方法。 是什么原因造成的?在这种情况下如何绕过默认方法?

1 个答案:

答案 0 :(得分:1)

子类应该声明一个构造函数,该构造函数显式调用以下父构造函数:

configuration()

否则它将不会按照发布的代码进行编译...如果编译,则意味着父类没有no arg构造函数。这将被隐式调用(在已编译的类中),而不是要使用覆盖的Test方法调用的内容。

App和Logic不应在Logic中耦合。
因此,您可以引入一个类来定义public TestLogic implements Logic{ @Override public AppConfiguration configuration() { return new AppConfiguration(25, "Test", true); } } 子类:

Test

并添加Logic构造函数以传递this实例(此处为public class Test extends App { public Test() { super(new TestLogic()); } } ):

<ComponentA :child-component="ComponentB" />

<ComponentA :child-component="ComponentC" />