Что такое абстрактные классы?
В объектно-ориентированном программировании абстрактный класс – это класс, который не может быть создан напрямую, но задает общую структуру для дочерних классов.
Основные особенности абстрактных классов:
- Они не могут быть созданы как объект (new AbstractClass вызовет ошибку).
- Могут содержать как реализованные методы, так и абстрактные методы (без реализации).
- Абстрактные методы обязательны для реализации в дочерних классах.
- Могут иметь свойства и обычные методы, доступные для наследников.
Когда использовать абстрактные классы?
- Если у вас есть несколько классов с общей логикой, но каждый должен реализовать свою часть кода.
- Если вам нужно частично реализовать логику, оставляя детали дочерним классам.
- Когда интерфейс недостаточен, потому что вам нужно хранить общие свойства и методы.
Пример из жизни:
Представьте, что у нас есть разные виды транспорта: автомобиль, велосипед и электросамокат.
Все они могут двигаться, но у каждого – своя логика передвижения.
Создадим абстрактный класс Transport
Реализуем конкретные виды транспорта
Использование абстрактного класса
Что мы получили?
Мы определили общую структуру (Transport) и уникальные реализации (move()) для каждого вида транспорта.
Если завтра добавится поезд, мы просто создадим новый класс Train, наследующий Transport, без изменения старого кода.
Пример из жизни:
Допустим, у нас есть разные типы банковских счетов: обычный и накопительный. У обоих есть баланс, но разные способы начисления процентов.
Создадим абстрактный класс BankAccount
Реализуем конкретные виды счетов
Использование классов
Что мы получили?
Код стал гибким: можно добавлять новые типы счетов без изменения существующего кода.
Мы заставили наследников реализовать calculateInterest(), обеспечив структуру программы.
Чем абстрактные классы отличаются от интерфейсов?
- Абстрактные классы могут содержать свойства, а интерфейсы — нет. Это значит, что в абстрактном классе можно определять переменные (поля), которые будут доступны в его потомках. В интерфейсе же можно описывать только методы без конкретной реализации.
- Абстрактные классы могут содержать как абстрактные, так и обычные методы, то есть методы с уже готовой реализацией. В интерфейсе до PHP 8.0 такой возможности не было — в нём можно было объявлять только методы без реализации. Однако, начиная с PHP 8.0, в интерфейсах можно использовать методы по умолчанию с реализацией, но это всё же не делает их аналогами абстрактных классов.
- Третье отличие заключается в том, что PHP не поддерживает множественное наследование абстрактных классов. Это означает, что класс может унаследовать только один абстрактный класс. В отличие от этого, интерфейсы можно реализовывать в любом количестве, что делает их более гибкими при проектировании сложных систем.
- Абстрактные классы не требуют обязательной реализации всех своих методов в дочерних классах, тогда как интерфейс предполагает, что каждый класс, который его реализует, обязан прописать реализацию всех его методов.
Когда использовать что?
- Если нет общей логики, но нужен общий стандарт – используйте интерфейсы.
- Если нужно разделить общие свойства и методы между наследниками – используйте абстрактные классы.
Пример: Создание животных с интерфейсами и абстрактными классами
Допустим, у нас есть разные животные, которые издают звуки и передвигаются разными способами.
Создаем интерфейс для звуков
Создаем абстрактный класс Animal
Реализуем конкретных животных
Использование
Что мы получили?
Интерфейс Sound определяет общий стандарт для звуков животных.
Абстрактный класс Animal задает базовую структуру для передвижения.
Абстрактные классы – это сильный инструмент ООП, который помогает:
- Создавать гибкую архитектуру.
- Заставлять дочерние классы реализовывать нужные методы.
- Обеспечивать единообразие кода.
Используйте их, когда:
- Есть общие свойства и методы (например, баланс у банковских счетов).
- Частично реализована логика, но детали оставлены дочерним классам (например, move() в Transport).
- Нужно избежать дублирования кода.
Абстрактные классы – отличный способ сделать код чистым, структурированным!
Подробнее об интерфейсах можно прочитать здесь Интерфейсы в PHP