У меня проблемы с пониманием того, как класс может ассоциировать (или иметь композиционные отношения) с интерфейсом или абстрактным классом. Насколько я знаю, я не могу инициировать интерфейс (ни абстрактный класс).
Как работает это отношение и как я могу использовать класс, имеющий композиционное отношение с интерфейсом?
да, они не могут иметь экземпляр, но на самом деле тип связанного элемента эффективный является одним из подтипов.
Пример:
interface ButtonServer {
public void buttonPressed();
};
class SendButtonAdapter implements ButtonServer {
public void buttonPressed() {
System.out.println("SendButtonAdapter buttonPressed");
}
}
class DigitButtonAdapter implements ButtonServer {
public void buttonPressed() {
System.out.println("DigitButtonAdapter buttonPressed");
}
}
class Button {
private ButtonServer server;
public Button(ButtonServer b) {
server = b;
}
void pressed() {
server.buttonPressed();
}
}
class Main {
public static void main(String argv[]) {
Button b1 = new Button(new SendButtonAdapter());
b1.pressed();
Button b2 = new Button(new DigitButtonAdapter());
b2.pressed();
}
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ javac Main.java
pi@raspberrypi:/tmp $ java Main
SendButtonAdapter buttonPressed
DigitButtonAdapter buttonPressed
pi@raspberrypi:/tmp $
Еще один вопрос: если я хочу расширить класс кнопки до нового класса (KeyBoard), как отношение композиции повлияет на класс KeyBoard? Мне нужно реализовать интерфейс? Могу ли я это игнорировать?
Кажется, домен является телефоном, поэтому Button является ключом, а KeyBoard не наследует / не реализует ButtonServer потому что это не имеет смысла, но у вас есть ассоциация Клавиатура -1 ---- n_keys- Кнопка