/ / Dlaczego JCombobox nie jest podklasą AbstractButton? [zamknięte] - java, huśtawka, dziedziczenie

Dlaczego JCombobox nie jest podklasą AbstractButton? [zamknięty] - java, swing, dziedziczenie

AbstractButton definiuje metodę addActionListener. JButton i dziedziczy je kilka innych popularnych klas.

Jestem w pozycji, w której chcę napisać metodę, która pobiera tablicę obsługiwanych obiektów addActionListener, bierze ActionListeneri dodaje detektor akcji do wszystkich tych obiektów. Więc napisałem taką metodę:

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

Jednak niektóre z tych obiektów, które próbuję przekazać tą metodą, są JCombobox instancje. Mają metodę addActionListener robi dokładnie to, co robi AbstractButton podklasy. Ale z jakiegoś powodu JCombobox nie dziedziczy po AbstractButton.

Zmusza mnie to do użycia wzorca adaptera w celu owinięcia niezgodnego JComboboxes w obiektach, które dziedziczą AbstractButton:

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

Moje pytanie brzmi: dlaczego nie JCombobox dziedziczyć AbstractButton? Czy to nie ma sensu?

Odpowiedzi:

2 dla odpowiedzi № 1

Ponieważ JComboBox nie jest AbstractButton. Teraz może mieć sens, aby zarówno AbstractButton, jak i JComboBox były interfejsem zdefiniowanym jako ActionListenerAccepter lub coś w tym rodzaju, ale to nie był sposób, w jaki zdefiniowano dwie klasy.

Zakładając, że potrzebujesz rozwiązania z jedną metodą(jeśli nie użyję przeciążonych metod, jak sugerowane), po prostu użyję instanceof w tym przypadku, aby twój kod był prosty (unikając czegoś takiego jak ten adapter, który masz).

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);
}