>

기존 패키지를 사용하여 자체 앱을 만들려고합니다. 그러나 인터페이스 매개 변수화 된 메소드를 호출하는 방법을 모르겠습니다.

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;
}
}

앱 출력 :

(1000, "Hello world", true)

이제 앱의 내 확장을 만들면 재정의가 수행되지 않습니다.

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

    하위 클래스는 다음 부모 생성자를 명시 적으로 호출하는 생성자를 선언해야합니다.

    protected App(Logic logic) {
        this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic));
    }
    
    
    그렇지 않으면 게시 된 코드에 따라 컴파일되지 않습니다 ... 컴파일하면 부모 클래스에 인수 생성자가 없습니다. 이것은 (컴파일 된 클래스에서) 내재적으로 호출되며 재정의 된 configuration() 를 사용하기 위해 호출하려는 것이 아닙니다.  방법.

    App과 Logic은 Test 에서 연결해서는 안됩니다
    그래서 당신은 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());
      } 
    }
    
    

관련 자료

  • 이전 php - htaccess 파일을 사용하여"http - //wwwexamplecom/pathquery-string=something"과 같은 url을 오류 페이지로 리디렉션하는 방법
  • 다음 shell - 로그인 성공 후 Bash 스크립트 실행이 트리거되지 않습니다