2015-01-19 4 views
2

여기를 둘러 보았는데 제 질문에 대한 답을 찾을 수 없었습니다. Java의 수퍼 클래스에서 하위 클래스 메서드를 어떻게 호출합니까?Java의 수퍼 클래스에서 하위 클래스 메서드를 어떻게 호출합니까?

기본적으로 내가 원하는 것은 : String을 명령의 매개 변수로 사용하는 exec이라는 메서드가 있습니다. 서브 클래스 이름을 미리 알지 못하고 수퍼 클래스에서 개발자가 오버라이드 한 서브 클래스에서 exec 메서드를 호출 할 수 있기를 원합니다.

이것은 마치 Thread 클래스의 작동 방식과 같습니다. 나는 내가 찾은 모든 대답이 무엇인지 찾고 싶지 않다. 바로 Superclass object = new Subclass();이고, 그 후에는 object.method();으로 전화하면된다.

는 수퍼

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.input.*; 
import javafx.scene.text.Text; 



public abstract class Console extends Application { 
    private String title; 
    private static Text output = new Text(); 


    public void create(String title) { 
     this.title = title; 
     launch(); 
    } 

    public void start(Stage stage) { 
     stage.setOnCloseRequest((WindowEvent event) -> { 
      System.exit(0); 
     }); 
     stage.setTitle(title); 
     stage.setResizable(false); 
     Group root = new Group(); 
     Scene scene = new Scene(root, 800, 400); 
     stage.setScene(scene); 
     ScrollPane scroll = new ScrollPane(); 
     scroll.setContent(output); 
     scroll.setMaxWidth(800); 
     scroll.setMaxHeight(360); 
     TextField input = new TextField(); 
     input.setLayoutX(0); 
     input.setLayoutY(380); 
     input.setPrefWidth(800); 
     scene.setOnKeyPressed((KeyEvent event) -> { 
      if(event.getCode() == KeyCode.ENTER) { 
       exec(input.getText()); 
       input.clear(); 
      } 
     }); 
     root.getChildren().add(scroll); 
     root.getChildren().add(input); 
     stage.show(); 
    } 
    public static void appendOutput(String value) { 
     Platform.runLater(() -> { 
      output.setText(output.getText() + "\n" + value); 
     }); 
    } 
    protected abstract void exec(String command); 
} 
+2

간단한 답 : 당신은 표시 할 코드가 있습니까? – Coffee

+6

그렇지 않습니다. 슈퍼 클래스는 그 서브 클래스에 관해서는 아무것도 알지 못한다. –

+2

당신은 상속을위한 것이 아닙니다. – alfasin

답변

0

내 특정 자바 FX 서브 클래 싱 질문에 대한 대답은 여기 Subclassing a JavaFX Application 이상 :

여기 데모입니다. 일반적인 하위 클래스 작성의 경우 여기에 대한 응답이 적절합니다.

4

의 코드 [...] I는 명령 문자열을 매개 변수로 얻어 간부라고하는 방법이있다. 나는 개발자가 서브 클래스 이름을 미리 알지 못하고 수퍼 클래스에서 오버라이드 한 서브 클래스에서 exec 메소드를 호출 할 수 있기를 원한다.

특별한 조치를 취할 필요가 없습니다. 방금 기본 클래스의 코드에서 호출합니다. Java의 모든 메소드는 가상이므로 서브 클래스의 겹쳐 쓰기 구현이 호출됩니다.

public class Test { 
    public static void main(String[] args) { 
     Console console = new ConsoleSubclass(); 
     console.start(); 
     console.keyPressed(); 
    } 
} 

abstract class Console { 

    Runnable keyPressedHandler; 

    private void setOnKeyPressed(Runnable handler) { 
     keyPressedHandler = handler; 
    } 

    public void keyPressed() { 
     keyPressedHandler.run(); 
    } 

    public void start() { 
     setOnKeyPressed(() -> { 
      exec(); 
     }); 
    } 

    abstract void exec(); 
} 

class ConsoleSubclass extends Console { 
    @Override 
    void exec() { 
     System.out.println("In ConsoleSubclass"); 
    } 
} 
+0

기본 클래스 란 무엇입니까? – Scoopta

+0

대답은 약간 오도하는 것입니다. 기본 클래스에서 호출하지 않아도됩니다. x() 메서드가 수퍼 클래스에 정의되어 있고 하위 클래스에서 재정의 된 경우 하위 클래스의 개체에 대한 참조가있는 클래스는 objectReference.x()를 호출 할 수 있으며 하위 클래스의 메서드를 호출합니다. 이 참조에 대한 선언의 유형이 수퍼 클래스의 유형 인 경우에도 마찬가지입니다. – arcy

+0

답변을 약간 업데이트했습니다. 너 내가 무슨 뜻인지 알지 못해. OPs의 경우, 그는 서브 클래스 구현을 수퍼 클래스에서 호출하려고합니다. – aioobe

0
public class UsingClass 

{ 
    SuperClassType x = null; 
    x = goGetClassReference(); // this can get an instance of SuperClassType, 
          // or of any subclass of it. 
    x.methodName(); // this calls methodName on the class obtained above; 
     //if goGetClassReference got a subclass, this calls methodName() on the subclass. 
}