У меня есть две иерархии классов Java, которые совместно используют общий предок и реализуют общий интерфейс. Мне нужно передать указатель на одну из этих вещей методу в другом классе.Требование аргумента расширяет определенный класс И реализует конкретный интерфейс
interface I { ... }
class A extends java.awt.Component implements I { ... }
class B extends java.awt.Component implements I { ... }
class D {
Component c;
I i;
void m(? x) {
c = (Component) x;
i = (I) x;
}
}
Есть ли что-то я могу заменить «?
» с, которая позволит мне пройти в либо «A
» или «B
»? Если я произнес «x
» до java.awt.Component
и сохранил его в «c
» и до I
и сохранил его в «i
», я теряю выгоду от сильной типизации.
Нужно ли мне объявить
class D {
void m(java.awt.Component c, I i) { ... }
}
и называем его 'm(a, a)
' или 'm(b, b)
', где
A a = new A();
B b = new B();
Я не могу создать
abstract class C extends java.awt.Component implements I {...}
и передать в потому что ни A
, ни B
не является C
.
Кстати, это можно сделать в Scala?
EDIT: Реальная проблема, которую я пытаюсь решить, что у меня есть два класса, один, который простирается JInternalFrame
, а другой, который проходит JPanel
. Оба являются абстрактными и предоставляют некоторые общие функции для виджетов, отображаемых в них (JTables, где пользователь может редактировать строки, удалять строки и т. Д.). Код для редактирования и удаления строк всегда один и тот же, независимо от отображения отображаемых типов объектов. У меня есть несколько методов, которые позволяют пользователю щелкнуть строку, выбрать «Удалить» из всплывающего меню и, например, запросить подтверждение, удаляет выбранную строку и объект базы данных. Иногда мне нужен подкомпонент кадра, а иногда и подкомпонент панели. Я создал класс делегата для общей функциональности и переменной экземпляра в каждом из абстрактных классов этого типа делегата. Производные классы JInternalFrame
и JPanel
просто переносят фактические реализации делегата. Класс делегата, в свою очередь, нуждается в указателе на класс «владелец» для обратных вызовов, чтобы получить выбранную строку таблицы и т. Д., И указатель на характер «Component
» каждого родителя для диалоговых окон подтверждения JOptionPane
.
Использование подхода generics Java работает очень хорошо. Класс делегата теперь определяется как общий класс на <T extends Component & DelegateContainer
, и каждый из классов абстрактных классов реализует DelegateContainer
(где объявляются методы обратного вызова).
Если бы я переписал это в Scala, я бы, вероятно, сделал что-то с чертами вместо создания класса делегата. Черты могут «добавить» функциональность удаления к конкретному классу JInternalFrame
, например.
Спасибо за быстрые ответы.
A и B являются Компонентами, которые реализуют I ... это требует AbstractIComponent ... почему это не работает для вас? – Arne
@Arne: Я не верю, что это сработает, потому что классы 'A' и' B' не относятся к типу 'AbstractIComponent'. – Ralph