Как использовать интерфейсы и абстрактные методы?

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

Разве это не может быть достигнуто с помощью процесса? например, разработка на основе тестирования.

Это кажется негибким. Что происходит при изменении кода?

Я изо всех сил пытаюсь понять необходимость этих ограничений.
Зачем даже добавлять интерфейс в код, когда он может сделать больше работы в будущем?

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() {}
}
Другие вопросы по тегам