В стремлении написать лучший код вы столкнетесь со многими абстрактными понятиями, объяснения которых сами по себе часто являются абстрактными. Идея интерфейса проста, если она основана на коде, так что именно так я рассматриваю ее здесь.
Ниже приведен интерфейс в диспетчере контактов, который я создавал на Java. Это приложение командной строки, которое хранит информацию в памяти. Вместо класс там написано интерфейс ,
Пример 1
interface InputOutput {
void display(String message);
String confirmInput(String field, boolean isAnUpdate);
int getNumberInput();
String getInput(String detail);
}
Что делает интерфейс?
Ничего. Это просто план, которого вы должны придерживаться.
Если бы я удалил его и все упоминания о нем из своего проекта, ничего бы не изменилось. Это неудивительно, так как четыре метода, которые он содержит, не имеют тела. Потому что это абстрактные методы/схемы.
Однако, поскольку мой класс Consoleio (см. Пример 2) “реализует ввод-вывод”, он должен содержать методы, которые содержит интерфейс ввода-вывода. Другими словами, мы утверждаем, что ввод-вывод использовался в качестве модели, вокруг которой был создан класс ConsoleIO.
Он также может содержать методы, не указанные в интерфейсе, но он должен иметь эти основные методы.
Пример 2 показывает класс, по которому был смоделирован интерфейс ввода-вывода (в этом случае я создал класс и извлек интерфейс после, но в будущем я мог бы начать с интерфейса). Он содержит те же четыре метода, а также собственный метод экземпляра и некоторые переменные. Разница в том, что у методов теперь есть тела, реализующие детали соответствующей функциональности, как я считаю нужным.
Пример 2
public class ConsoleIO implements InputOutput {
private final InputStream input;
private final OutputStream output;
private final BufferedReader reader;
public final PrintStream printer;
public ConsoleIO(InputStream input, OutputStream output) {
reader = new BufferedReader(new InputStreamReader(input));
printer = new PrintStream(output);
this.input = input;
this.output = output;
}
public void display(String message) {
printer.println(message);
}
public String confirmInput(String field, boolean isAnUpdate) {
Boolean validInput = false;
String userInput = null;
while (!validInput) {
userInput = getInput(field);
validInput = ValidateInput.validateInput(field, userInput, isAnUpdate);
}
return userInput;
}
public int getNumberInput() {
String userInput;
try {
userInput = reader.readLine();
} catch (IOException e) {
return - 1;
}
try {
return Integer.parseInt(userInput);
} catch (NumberFormatException e) {
return 0;
}
}
public String getInput(String detail) {
display("Please enter your " + detail + ":");
String userInput = null;
try {
userInput = reader.readLine();
} catch (IOException e) {
display("Cannot read line" + e);
}
return userInput;
}
}
Давайте Перейдем К Абстрактному
Интерфейс не обрабатывает ничего конкретного. В нем не указано, как должны быть реализованы содержащиеся в нем методы, только то, что они должны существовать.
Интерфейс – это план для будущих классов, которые будут реализовывать ту же функциональность в другом контексте. В данном случае это интерфейс ввода-вывода, поэтому, если в будущем я добавлю класс в свою программу, чтобы он работал в режиме онлайн, а также в командной строке, ему понадобятся методы для:
- Вывод на дисплей
- Подтвердите ввод
- Получить строковый ввод
- Получить ввод в меню
Полиморфизм
Пример 3
interface Save {
void saveNumber(String phoneNumber)
}
class File implements Save
public void saveNumber(String phoneNumber) {
// However you implement saving to a file
}
}
class Database implements Save
public void saveNumber(String phoneNumber) {
// However you implement saving to a database
}
}
Интерфейсы помогают создавать системы, реализующие полиморфизм. Идея полиморфизма заключается в том, что классы взаимозаменяемы, поэтому замена экземпляра класса Файл для одного из База данных не имеет значения, так как у них одни и те же методы.
Допустим Телефонная книга вызывает метод write для любого из них, вводя соответствующий класс в качестве назначения .
destination.saveNumber("5550123");
Это будет работать в любом случае, и программа не будет знать или заботиться о том, куда она сохраняет.
Закрытие
Интерфейсы абстрактны, потому что они служат планами или напоминаниями, а не имеют какой-либо реальной функциональности. Такие языки, как Ruby, даже не имеют интерфейсов, но это помогает вам помнить о них при проектировании вашей системы.
Оригинал: “https://dev.to/jimjule/interfaces-explained-3gje”