我环顾四周,想找到问题的答案,但找不到。 Java中如何从超类调用子类方法?
基本上我想做的是这样的:我有一个名为exec
这需要一个String
作为命令的参数。我希望能够致电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);
}
[...] 我有一个名为 exec 的方法,它采用字符串作为命令的参数。我希望能够调用开发人员从超类重写的子类中的 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");
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)