Рубрики
Без рубрики

Объясненные интерфейсы

В стремлении написать лучший код вы столкнетесь со многими абстрактными понятиями, объяснениями причин… Помеченный java.

В стремлении написать лучший код вы столкнетесь со многими абстрактными понятиями, объяснения которых сами по себе часто являются абстрактными. Идея интерфейса проста, если она основана на коде, так что именно так я рассматриваю ее здесь.

Ниже приведен интерфейс в диспетчере контактов, который я создавал на 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;
}
}

Давайте Перейдем К Абстрактному

Интерфейс не обрабатывает ничего конкретного. В нем не указано, как должны быть реализованы содержащиеся в нем методы, только то, что они должны существовать.

Интерфейс – это план для будущих классов, которые будут реализовывать ту же функциональность в другом контексте. В данном случае это интерфейс ввода-вывода, поэтому, если в будущем я добавлю класс в свою программу, чтобы он работал в режиме онлайн, а также в командной строке, ему понадобятся методы для:

  1. Вывод на дисплей
  2. Подтвердите ввод
  3. Получить строковый ввод
  4. Получить ввод в меню

Полиморфизм

Пример 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”