#java #ооп
Только начал изучать Java, поэтому вопрос скорее всего глупый. Пример кода из Хорстманна: public class TimerTest { public static void main(String[] args) { ActionListener listener = new TimePrinter(); // construct a timer that calls the listener // once every 10 seconds Timer t = new Timer(10000, listener); t.start(); JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } } class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event) { Date now = new Date(); System.out.println("At the tone, the time is " + now); Toolkit.getDefaultToolkit().beep(); } } Почему в данной строчке используется интерфейсная переменная? Почему не объектная? Что за процесс происходит? ActionListener listener = new TimePrinter();
Ответы
Ответ 1
Если в будущем вы захотите использовать не TimePrinter, а другую реализацию ActionListener? Конечно, можно делать как вам вздумается. А сделано для того, чтобы можно было на лету менять конечную реализацию (к примеру, вместо TimePrinter использовать MsecTimePrinter, т.е. другую реализацию интерфейса ActionListener). Поэтому и принято оперировать интерфейсами. Чтобы не связывать свой код жестко конкретными реализациями, т.к. в интерфейс можно присвоить любой класс, который реализует данный интерфейс. Это ПРАВИЛЬНЫЙ подход к написанию кода А процесс происходит довольно простой: вы объявляете интерфейсную переменную типа ActionListener и связываете её с объектом TimePrinter. В последующем вы используете только методы интерфейса ActionListener, что освобождает вас от знания конкретной реализации самого класса TimePrinter.Ответ 2
То на что Вы указали есть реализация одного из принципов ООП(ООД), а конкретно "принцип подстановки Барбары Лисков". Обычно данный принцип объединяют c 4-мя другими и называют акронимом SOLID. Суть принципа заключается в следующем везде, где используют базовый тип, есть возможность использовать подтипы базового типа, при этом с точки зрения кода не имеет значения, работает ли он с базовым или дочерним типом. В приведенном примере этот принцип проявляется в двух местах: 1) ActionListener listener = new TimePrinter(); 2) Timer(10000, listener);
Комментариев нет:
Отправить комментарий