Класс, связанный с интерфейсом или абстрактным классом - PullRequest
2 голосов
/ 18 апреля 2020

У меня проблемы с пониманием того, как класс может ассоциироваться (или иметь композиционное отношение) с интерфейсом или абстрактным классом. Насколько я знаю, я не могу инициировать интерфейс (ни абстрактный класс).

Как работает это отношение и как я могу использовать класс, имеющий композиционное отношение с интерфейсом? Как я прикрепил ниже.

Еще один вопрос: если я хочу расширить класс кнопки на новый класс (KeyBoard), как отношение композиции повлияет на класс KeyBoard? Мне нужно реализовать интерфейс? Могу ли я игнорировать это?

Composition relation of button and button server

Спасибо

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Проще говоря: вы не можете создать экземпляр ButtonServer, но вы можете создать экземпляр SendButtonServer. И это будет агрегировать Button s.

Когда вы подкласс Button, SendButtonServer может использовать только то, что определено в Button, но ничего больше. Если вам нужны ваши подклассы в SendButtonServer, вам нужно изменить определение и заменить Button. Но как не понятно по твоему вопросу.

0 голосов
/ 18 апреля 2020

У меня проблемы с пониманием того, как класс может ассоциировать (или иметь композиционные отношения) с интерфейсом или абстрактным классом. Насколько я знаю, я не могу инициировать интерфейс (ни абстрактный класс).

Как работает это отношение и как я могу использовать класс, имеющий композиционное отношение с интерфейсом?

да, они не могут иметь экземпляр, но на самом деле тип связанного элемента эффективный является одним из подтипов.

Пример:

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- Кнопка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...