如何在超类构造函数中插入来自子类构造函数的代码?
How can I insert code from subclass constructor in superclass constructor?
所以我有这个超类,它使 JPanel 具有一些组件。现在我需要子类制作一些单选按钮并让它们显示在 buttonMin 之前。现在我的问题是:如何在我需要的超类中调用我的子类中的代码(请参阅代码以了解应在何处调用代码)?
我的超班级
public class RecordLine extends JPanel{
public RecordLine(Product product){
JTextField fieldName = new JTextField();
fieldName.setText(product.getName());
this.add(fieldName);
Component horizontalStrut = Box.createHorizontalStrut(20);
this.add(horizontalStrut);
//Subclass code should be executed here
Component horizontalStrut_1 = Box.createHorizontalStrut(20);
this.add(horizontalStrut_1);
JButton buttonMin = new JButton("-");
this.add(buttonMin);
}
}
我的子类
public class RecordLineDrinks extends RecordLine {
public RecordLineDrinks(Product product) {
super(product);
JRadioButton rdbtnFles = new JRadioButton("Fles");
this.add(rdbtnFles);
}
}
你不能直接......你可以让你的超类抽象然后实现一个你在构造函数中途调用的方法
public abstract class RecordLine extends JPanel{
abstract void midwayUpdate();
然后是
public class RecordLineDrinks extends RecordLine {
public RecordLineDrinks(Product product) {
super(product);
}
void midwayUpdate() {
JRadioButton rdbtnFles = new JRadioButton("Fles");
this.add(rdbtnFles);
}
}
你会有 "template method".
在超类中定义(但不一定在那里执行任何操作)并从超类的方法中调用。
在子类中,您可以覆盖该方法来做事。
//Subclass code should be executed here
this.addExtraButtons();
如果你在构造函数中这样做,你必须要小心一点,因为它会在实例完全初始化之前被调用。将所有这些代码移动到其他一些 setup()
方法中可能会更清晰。
您可能需要更改 class 结构,提供一种可用于创建 UI(即 createView
)的方法,从中它可以访问其他通过 getters
的组件
这样,您可以更改 createView
的工作方式。
问题在于,您将负责在您的子class中完全重新创建UI,因此您将需要getter方法用于另一个UI 个组件。
另一种选择是,如果您知道要在何处添加新组件,则可以提供不执行任何操作但允许子 classes 修改
的方法的默认实现
public class RecordLine extends JPanel{
public RecordLine(Product product){
JTextField fieldName = new JTextField();
fieldName.setText(product.getName());
this.add(fieldName);
Component horizontalStrut = Box.createHorizontalStrut(20);
this.add(horizontalStrut);
//Subclass code should be executed here
Component horizontalStrut_1 = Box.createHorizontalStrut(20);
this.add(horizontalStrut_1);
addBeforeMinButton();
JButton buttonMin = new JButton("-");
this.add(buttonMin);
}
protected void addBeforeMinButton() {
}
}
但这通常意味着您事先知道您可能希望如何修改 UI
所以我有这个超类,它使 JPanel 具有一些组件。现在我需要子类制作一些单选按钮并让它们显示在 buttonMin 之前。现在我的问题是:如何在我需要的超类中调用我的子类中的代码(请参阅代码以了解应在何处调用代码)?
我的超班级
public class RecordLine extends JPanel{
public RecordLine(Product product){
JTextField fieldName = new JTextField();
fieldName.setText(product.getName());
this.add(fieldName);
Component horizontalStrut = Box.createHorizontalStrut(20);
this.add(horizontalStrut);
//Subclass code should be executed here
Component horizontalStrut_1 = Box.createHorizontalStrut(20);
this.add(horizontalStrut_1);
JButton buttonMin = new JButton("-");
this.add(buttonMin);
}
}
我的子类
public class RecordLineDrinks extends RecordLine {
public RecordLineDrinks(Product product) {
super(product);
JRadioButton rdbtnFles = new JRadioButton("Fles");
this.add(rdbtnFles);
}
}
你不能直接......你可以让你的超类抽象然后实现一个你在构造函数中途调用的方法
public abstract class RecordLine extends JPanel{
abstract void midwayUpdate();
然后是
public class RecordLineDrinks extends RecordLine {
public RecordLineDrinks(Product product) {
super(product);
}
void midwayUpdate() {
JRadioButton rdbtnFles = new JRadioButton("Fles");
this.add(rdbtnFles);
}
}
你会有 "template method".
在超类中定义(但不一定在那里执行任何操作)并从超类的方法中调用。
在子类中,您可以覆盖该方法来做事。
//Subclass code should be executed here
this.addExtraButtons();
如果你在构造函数中这样做,你必须要小心一点,因为它会在实例完全初始化之前被调用。将所有这些代码移动到其他一些 setup()
方法中可能会更清晰。
您可能需要更改 class 结构,提供一种可用于创建 UI(即 createView
)的方法,从中它可以访问其他通过 getters
这样,您可以更改 createView
的工作方式。
问题在于,您将负责在您的子class中完全重新创建UI,因此您将需要getter方法用于另一个UI 个组件。
另一种选择是,如果您知道要在何处添加新组件,则可以提供不执行任何操作但允许子 classes 修改
的方法的默认实现public class RecordLine extends JPanel{
public RecordLine(Product product){
JTextField fieldName = new JTextField();
fieldName.setText(product.getName());
this.add(fieldName);
Component horizontalStrut = Box.createHorizontalStrut(20);
this.add(horizontalStrut);
//Subclass code should be executed here
Component horizontalStrut_1 = Box.createHorizontalStrut(20);
this.add(horizontalStrut_1);
addBeforeMinButton();
JButton buttonMin = new JButton("-");
this.add(buttonMin);
}
protected void addBeforeMinButton() {
}
}
但这通常意味着您事先知道您可能希望如何修改 UI