@AnnaBb
начинающий разработчик PHP

Зачем нужны абстрактные классы (PHP)?

Начала изучать ООП и не не могу разобраться в том, зачем нужны абстрактные классы, если есть интерфейсы.
Интерфейс, как я понимаю, нужен, грубо говоря, для следующего. Есть у нас, допустим, объекты класса Овощ. И есть интерфейс Салат, который реализует методы Мыть, Резать, Перемешать. И этот интерфейс мы можем потом применять к каким-то другим классам, если нужны будут все эти методы (например, к объектам класса Фрукт).
А вот про абстрактные классы я не понимаю, зачем они нужны, где и когда их правильно использовать. Если можно, приведите, пожалуйста, какие-то простые примеры, которые показывают, что в каком-то случае надо применять абстрактный класс, а не интерфейс.
Спасибо.
  • Вопрос задан
  • 10944 просмотра
Пригласить эксперта
Ответы на вопрос 7
У разных языков по разному. Например в Java можно реализовывать кучу интерфейсов, но нельзя реализовать множественное наследование не больше 3-ех наследников и с помощью интерфейсов решают это.

Интерфейс нужен обычно, когда описывается только интерфейс (тавтология). Например, один класс хочет дать другому возможность доступа к некоторым своим методам, но не хочет себя "раскрывать". Поэтому он просто реализует интерфейс.

Абстрактный класс нужен, когда нужно семейство классов, у которых есть много общего. Конечно, можно применить и интерфейс, но тогда нужно будет писать много идентичного кода.

Пример: Абстрактный класс заведомо не будет запрошен как объект. К примеру абстрактный класс - Транспорт: Но все его наследники будут Автомобилем, краном, лодкой, самолет и т.д. Например вы заведомо знаете, что весь транспорт будет двигаться. И вы объявляете абстрактный метод(движение) в абстрактном классе, который нужен будет 100% всем наследникам т.е. без движения это уже не транспорт и новый наследник обязан будет реализовать это. В самом же абстрактном классе, есть другие поля и свойства, которые будут унаследованы. Ну например мощность двигателя(очень грубо), или то что их роднит.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
типичный юзкейс для абстрактный классов - базовая реализация, уменьшение дублирования кода при появлении общего решения и т.д. Например у вас есть интерфейс с несколькими методами, и только 2-3 из них реализуются по разному. Выгодно вынести общую реализацию в базовый абстрактный класс.
Ответ написан
@tasce
Хороший ответ: www.quizful.net/interview/php/abstract-class-inter...

И, конечно, читаем оф. документацию: php.net/manual/ru/language.oop5.abstract.php
Ответ написан
iam_not_a_robot
@iam_not_a_robot
По-простому это заготовка.
Думаю немного прояснит ситуацию:
myrusakov.ru/abstraktnye-klassy-php.html
lifeexample.ru/php-primeryi-skriptov/abstraktnyiy-...

И конечно же статья "Перестаньте писать классы" habrahabr.ru/post/140581 ;)
Ответ написан
Комментировать
@utyfua
открываем википедию: Абстрактный класс в объектно-ориентированном программировании — базовый класс, который не предполагает создания экземпляров.
Это значит: мы можем создать класс site и закидаем его всеми функциями. бесполезно делать таких 2 и больше копий..
Ответ написан
Комментировать
edli007
@edli007
full stack, team lead
Ну про общее назначение тут все написали, однако есть еще нюанс называемый "позднее статическое связывание", что оно такое почитайте, много букв объяснять, но весьма важный нюанс в использовании абстрактных классов.
Ответ написан
Комментировать
@DaniPy
Python
Позволяет определить "Кто я такой и что я делаю?"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы