Как использовать интерфейсы и абстрактные методы?
Действительно ли интерфейсы и абстрактные методы используются для того, чтобы разработчики включили эти методы в свои классы?
Разве это не может быть достигнуто с помощью процесса? например, разработка на основе тестирования.
Это кажется негибким. Что происходит при изменении кода?
Я изо всех сил пытаюсь понять необходимость этих ограничений.
Зачем даже добавлять интерфейс в код, когда он может сделать больше работы в будущем?
2 ответа
Обычно вы используете интерфейсы или абстрактные классы для отделения двух конкретных классов друг от друга.
Давайте посмотрим на интерфейс MouseListener в Java, который позволяет отслеживать определенные события, такие как щелчки мыши. Этот интерфейс объявляет пять методов:
void mouseClicked(MouseEvent e);
void mouseEntered(MouseEvent e);
void mouseExited(MouseEvent e);
void mousePressed(MouseEvent e);
void mouseReleased(MouseEvent e);
Элементы пользовательского интерфейса, такие как кнопки, текстовые поля и т. Д. (Подклассы абстрактного класса Component) позволяют вам зарегистрироваться MouseListener
с addMouseListener
метод.
Component
класс, вероятно, содержит код для определения того, что мышь перемещается внутри определенной области и что кнопка мыши была нажата или отпущена в этой области. Все подклассы Component
Теперь извлекайте выгоду из такого поведения и не нужно реализовывать это самим.
Теперь есть много вещей, которые вы можете сделать с помощью мышиных событий. Возможно, вы захотите изменить цвет чего-либо в зависимости от положения мыши, вы можете захотеть показать или скрыть что-то, основываясь на щелчках мыши….... Существует бесконечный список вещей, которые вы можете сделать с событиями мыши. Так как же Component
знаете, что вы хотите сделать в одном конкретном случае?
Но так как вы знаете, что вы хотите сделать на событиях мыши заданного Component
, это позволяет вам зарегистрировать MouseListener
что он позвонит, когда произойдут вышеупомянутые события. И так как вы реализуете MouseListener
ты можешь делать все что хочешь....
В этом конкретном примере интерфейсы довольно гибки. Потому что даже если вы хотите сделать что-то другое для определенных событий мыши, вам не нужно менять Component
учебный класс. Вы должны изменить свой MouseListener
, конечно. Но реализация Component
остается неизменным для всех возможных вещей, которые вы можете захотеть сделать с событиями мыши.
Надеюсь, это поможет немного...
Обновить
Возможно, "проблема" в том, что в некоторых языках (таких как Java, C#, C++) вы должны предоставить информацию о типе во время компиляции, чтобы компилятор знал, какие методы существуют для данного объекта.
Из Википедии:
Языки со статической типизацией, в которых отсутствует вывод типов (например, C и Java), требуют, чтобы программисты объявляли типы, которые они намеревались использовать для метода или функции. Это может служить дополнительной документацией для программы [...]
Поэтому я думаю, что можно ответить на ваш вопрос положительно, интерфейсы и абстрактные методы используются для обеспечения того, чтобы разработчики включили эти методы в свои классы, но только потому, что в вышеупомянутых языках у компилятора нет других средств определения того, существует ли метод.
Но вы также можете ответить на ваш вопрос без объяснения причин, которые я попытался объяснить выше.
Крепкий орешек....
Я нашел ответ, который удовлетворяет мою потребность понять использование интерфейсов в рабочей команде.
Я чувствую, что это используется в проектах, чтобы гарантировать, что разработчики не пишут методы с похожими именами и создают путаницу. Прочтите главу 8: Интерфейсы и внутренние классы из второго издания "Мышление в Java" Брюса Эккеля
Я думаю, что все еще остается верным, что интерфейсы не являются абсолютно необходимыми. Но это можно сказать об ООП, я мог бы кодировать Java миллионами разных способов. Хотя я решил использовать ООП, чтобы минимизировать головные боли. Однако, если я работаю над кодом другого человека, я могу использовать интерфейс, чтобы узнать, какие другие методы можно найти в похожих классах, или даже создать методы, которые необходимо создать... и т. Д.
Вот пример из книги:
// Interfaces.
import java.util.*;
interface Instrument {
// Compile-time constant:
int i = 5; // static & final
// Cannot have method definitions:
void play(); // Automatically public
String what();
void adjust();
}
class Wind implements Instrument {
public void play() {
System.out.println("Wind.play()");
}
public String what() { return "Wind"; }
public void adjust() {}
}
class Percussion implements Instrument {
public void play() {
System.out.println("Percussion.play()");
}
public String what() { return "Percussion"; }
public void adjust() {}
}
class Stringed implements Instrument {
public void play() {
System.out.println("Stringed.play()");
}
public String what() { return "Stringed"; }
public void adjust() {}
}