Что такое интерфейс? Что такое абстрактный класс? Чем они отличаются?qa-37

Определения

Интерфейс

Контракт, который определяет **что** класс должен делать, без реализации **как**.

Характеристики:

  • Содержит только сигнатуры методов (до Java 8)
  • Все методы неявно public abstract
  • Поля только public static final (константы)

Абстрактный класс

Класс, который может содержать как абстрактные методы (без реализации), так и конкретные методы.

Характеристики:

  • Может иметь поля любого модификатора
  • Может содержать конструкторы
  • Может иметь реализованные методы

Ключевые различия

Критерий Интерфейс Абстрактный класс
Реализация Только сигнатуры (по умолчанию) Может содержать реализацию
Наследование Множественное (implements) Одиночное (extends)
Модификаторы Только public Любые модификаторы
Состояние Не может иметь полей (только константы) Может иметь состояние
Конструкторы Не может иметь Может иметь
Использование Для полиморфизма между несвязанными классами Для родственных классов

Примеры в контексте тестирования

Интерфейс для Page Object

public interface LoginPage {
    void enterUsername(String username);
    void enterPassword(String password);
    void clickSubmit();
    boolean isErrorDisplayed();
}

Абстрактный класс для базового теста

public abstract class BaseTest {
    protected WebDriver driver;

    public BaseTest(WebDriver driver) {
        this.driver = driver;
    }

    // Абстрактный метод (должен быть реализован)
    protected abstract void configureTest();

    // Реализованный метод
    protected void takeScreenshot(String name) {
        // общая реализация для всех тестов
    }
}

Когда что использовать?

Используйте интерфейс когда:

graph TD
    A[Нужно определить контракт] --> B[Для несвязанных классов]
    C[Требуется множественное наследование] --> D[Для реализации полиморфизма]

Используйте абстрактный класс когда:

graph TD
    E[Есть общая логика для родственных классов] --> F[Нужно наследовать состояние]
    G[Требуется контроль создания объектов] --> H[Для шаблонного метода]

Эволюция в Java 8+

Современные особенности:

  • Интерфейсы теперь могут иметь:
    • Дефолтные методы (default void method())
    • Статические методы
    • Приватные методы (Java 9+)

Пример:

public interface WebComponent {
    default void highlight() {
        // общая реализация для всех элементов
    }

    static boolean isDisplayed(WebElement element) {
        return element.isDisplayed();
    }
}

Практическое значение для QA

  1. Анализ кода:

    • Интерфейсы показывают ожидаемое поведение
    • Абстрактные классы часто содержат базовую логику
  2. Автотесты:

    • Можно создавать моки интерфейсов
    • Абстрактные классы полезны для базовых тестовых классов
  3. Паттерны:

    • Page Object часто используют интерфейсы
    • Test Factories могут использовать абстрактные классы

Резюмируем

Интерфейс - это:

  • Чистый контракт без реализации
  • Множественное наследование
  • Отличный инструмент для определения API

Абстрактный класс - это:

  • Частичная реализация
  • Одиночное наследование
  • Мощный инструмент для повторного использования кода

Главное отличие:

  • Интерфейс определяет что можно делать
  • Абстрактный класс может определять как это делать

Для эффективного тестирования важно понимать оба концепта, так как они широко используются в тестируемом коде и фреймворках автоматизации.