Интерфейс vs Абстрактный класс
Интерфейс
Интерфейс — это элемент ООП, который группирует набор объявлений методо в без их реализации. Он определяет контракт («что»), который класс обязан выполнить.
Правила
- Не может содержать реализацию методов.
- Все методы должны быть публичными.
- Не может содержать переменные/свойства (но может содержать константы).
- Класс может реализовывать несколько интерфейсов.
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
echo "Bark";
}
}
Абстрактный класс
Абстрактный класс — это частично реализованный класс. Он может содержать как абстрактные методы (которые должны быть реализованы в дочерних классах), так и обычные методы (которые предоставляют поведение по умолчанию).
Правила
- Может содержать как абстрактные, так и конкретные методы.
- Методы могут быть
public,protectedилиprivate(абстрактные методы не могут быть private). - Может содержать свойства (переменные).
- Класс может наследовать только один абстрактный класс.
- Нельзя создать экземпляр абстрактного класса.
abstract class Animal {
public $name;
// Абстрактный метод: без тела
abstract public function makeSound();
// Конкретный метод: с телом
public function sleep() {
echo "Sleeping...";
}
}
Сравнительная таблица
| Характеристика | Интерфейс | Абстрактный класс |
|---|---|---|
| Наследование | Класс может реализовывать несколько интерфейсов. | Класс может наследовать только один абстрактный класс. |
| Методы | Только сигнатуры методов, без тела. | Может содержать как абстрактные, так и конкретные методы. |
| Свойства | Нет свойств (только константы). | Может содержать свойства. |
| Видимость | Все методы должны быть публичными. | Методы могут быть public, protected. |
| Назначение | Определить контракт (поведение). | Предоставить базу для группы классов. |