如何在超类构造函数中插入来自子类构造函数的代码?

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