在不同,未知类的多个对象上调用相同的函数(read:具有相同返回类型的同名函数)

时间:2018-07-10 14:31:25

标签: java swing polymorphism

想象一下以下简单的Swing程序,其中包含三个Component,一个JLabel,一个JTextField和一个JCheckBox

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JCheckBox;

public class Example {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Example window = new Example();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Example() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));

        JLabel lblNewLabel = new JLabel("FOO");
        frame.getContentPane().add(lblNewLabel);

        JTextField textField = new JTextField("BAZ");
        frame.getContentPane().add(textField);

        JCheckBox chckbxBar = new JCheckBox("BAR");
        frame.getContentPane().add(chckbxBar);
    }

}

现在,我们希望将所有Components水平对齐到中心。这些Component各自的类中的每一个都公开函数setHorizontalAlignment(int alignment),但是这些类没有这样做的公共超类。

我将如何在JFrame中的每个组件或List<Component>中的每个组件上多态调用此函数?

为了进一步阐明,如果存在一个称为CommonSuperclass的通用超类,它公开了必要的功能,那么我将大致这样做:

List<Component> someSwingComponents = /*put some components in the list*/;
for (Component c : someSwingComponents) {
    if (c instanceof CommonSuperclass) {
        //component is horizontally alignable...
        ((CommonSuperclass) c).setHorizontalAlignment(SwingConstants.CENTER);
    }
}

这对于某些{em> {},例如ComponentJCheckBoxJRadioButton(例如,通用超类将在为JToggleButton,因为它确实具有所需的功能),但不适用于最接近的公共超类为JToggleButton的{​​{1}},因为它是没有所需的功能。

目前,我想摆脱以下丑陋且冗长的代码:

Component

我考虑过使用接口java.awt.Component,但是由于我不能(当然也不想)修改每个Swing if (component instanceof JLabel) { ((JLabel)component).setHorizontalAlignment(SwingConstants.CENTER); } else if (component instanceof AbstractButton) { ((AbstractButton)component).setHorizontalAlignment(SwingConstants.CENTER); } /* And so on for every type of Component that has setHorizontalAlignment()... */ 的类来实现IHorizontallyAlignable,因此相反,它需要一种方法来表示这些类已经已经满足Component接口的要求,因此尽管没有在IHorizontallyAlignable上进行技术实现,也可以将其强制转换为该类。关键字。

我希望不需要像在窗口中水平对齐每个{水平对齐} IHorizontallyAlignable这样简单的操作,但是如果您看不到其他方式,请发布基于反射的答案

0 个答案:

没有答案