Контракт, который определяет **что** класс должен делать, без реализации **как**.
Характеристики:
public abstract
public static final
(константы)Класс, который может содержать как абстрактные методы (без реализации), так и конкретные методы.
Характеристики:
Критерий | Интерфейс | Абстрактный класс |
---|---|---|
Реализация | Только сигнатуры (по умолчанию) | Может содержать реализацию |
Наследование | Множественное (implements) | Одиночное (extends) |
Модификаторы | Только public | Любые модификаторы |
Состояние | Не может иметь полей (только константы) | Может иметь состояние |
Конструкторы | Не может иметь | Может иметь |
Использование | Для полиморфизма между несвязанными классами | Для родственных классов |
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[Для шаблонного метода]
Современные особенности:
default void method()
)Пример:
public interface WebComponent {
default void highlight() {
// общая реализация для всех элементов
}
static boolean isDisplayed(WebElement element) {
return element.isDisplayed();
}
}
Анализ кода:
Автотесты:
Паттерны:
Интерфейс - это:
Абстрактный класс - это:
Главное отличие:
Для эффективного тестирования важно понимать оба концепта, так как они широко используются в тестируемом коде и фреймворках автоматизации.