Closed. This question is opinion-based。它当前不接受答案。
                            
                        
                    
                
            
                    
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                        
                        5年前关闭。
                    
                
        

AbstractButton定义方法addActionListenerJButton和其他几个常见的类继承了它。

我想编写一个方法,该方法采用支持addActionListener的对象数组,采用ActionListener并将动作侦听器添加到所有这些对象。所以我写了这样的方法:

private void addActionListener(ActionListener listener, AbstractButton... buttons){
    for(AbstractButton button : buttons)
        button.addActionListener(listener);
}


但是,我尝试在此方法中传递的某些对象是JCombobox实例。他们确实有一个方法addActionListener可以完全执行AbstractButton子类中的方法。但是由于某些原因,JCombobox不能从AbstractButton继承。

这迫使我使用适配器模式,以便将不兼容的JCombobox es包装在确实继承AbstractButton的对象中:

private static class ComboBoxListenableAdapter extends AbstractButton {
    JComboBox combobox;
    public ComboBoxListenableAdapter (JComboBox combobox){
        this.combobox = combobox;
    }
    public void addActionListener(ActionListener listener){
        combobox.addActionListener(listener);
    }
}


我的问题是:为什么JCombobox不继承AbstractButton?没道理吗

最佳答案

因为JComboBox不是AbstractButton。现在,将AbstractButton和JComboBox都定义为ActionListenerAccepter或类似的接口可能是有意义的,但这并不是定义两个类的方式。

假设您要使用一种方法的解决方案(如果不使用建议的重载方法),在这种情况下,我将只使用instanceof来简化代码(避免使用类似的适配器)。

private void addActionListener(ActionListener listener,
          JComponent... possibleActionListenerComponents)
{
    for(JComponent c : possibleActionListenerComponents)
        if (c instanceof AbstractButton)
            ((AbstractButton)c).addActionListener(listener);
        else if (c instanceof JComboBox)
            ((JComboBox)c).addActionListener(listener);
}

07-26 05:04