Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
5年前关闭。
我想编写一个方法,该方法采用支持
但是,我尝试在此方法中传递的某些对象是
这迫使我使用适配器模式,以便将不兼容的
我的问题是:为什么
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
5年前关闭。
AbstractButton
定义方法addActionListener
。 JButton
和其他几个常见的类继承了它。我想编写一个方法,该方法采用支持
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