我正在尝试使用现有程序包在其上创建自己的应用程序。但是我不知道如何调用接口参数化方法。
在使用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)
该应用程序仍会调用该界面的默认方法。 是什么原因造成的?在这种情况下如何绕过默认方法?
答案 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" />