Нужны ли абстрактные классы и интерфейсы в php

25 сентября, 13:26 Разное 4907 5

Зачем нужны абстрактные классы и интерфейсы? И в php тоже.
Я понимаю так: абстрактный класс позволяет декларировать методы для дочерних классов, также не определять в классе наследнике методы родителя, и что по сути от обычного класса он отличается тем, что в названии некоторых методов и названии класса есть приписка "abstract" и что нельзя создать его экземпляр. Вопрос: зачем тогда он вообще нужен?
Как я понимаю, он (абстрактный класс) носит чисто декоративный характер, нужен для ограничения действий разработчика, удобства разработки и вообще это лишь "сахар".
Та же тема с интерфейсами. Зачем они нужны, если потом их методы и свойства будут переопределяться? А если не будут, то чем хуже наследование от обычного родительского класса, где так же можно определить свойства и методы, но опустить реализацию?
Есть ещё трейты, но с ними более-менее понятно. Чтобы не плодить классы родители и от них каждый раз не перенаследоваться, создавая при этом огромные цепочки наследований, используются трейты, в которых определяется метод, который есть в классе родителе, и потом трейт подключается к классу наследнику, переопределяет родительский метод и нет лишней возни.

5 комментариев
Сортировка:
Добавить комментарий
Viktor Kravchenko
Viktor Kravchenko 2019, 25 сентября, 19:51
0
Как это зачем? Какой сахар? Базовый абстрактный класс задает интерфейс. И потом несколько разных дочерних классов задают разную реализацию для разных типов объектов. Но благодаря базовому абстрактному классу вы сможете например эти разные объекты создавать одной фабрикой или использовать их в других паттернах и классы этих паттернов могут работать с этими объектами через интерфейс в принципе ничего не зная об этих объектах (об их реализации). Вы сделав первый шаг, не поленитесь сделайте и второй. Почитайте о SOLID и GRASP про шаблоны проектирования. Когда вы выйдите на новый уровень абстрактного мышления. В голове произойдет (просветление) понимание ООП (а не вот эта вот примитивная мантра из трех слагаемых - инкапсуляция, наследование, полиморфизм). Большие коммерческие проекты все сплошь на абстракциях сделаны. Там все очень абстрактно.
Viktor Kravchenko
Viktor Kravchenko 2019, 25 сентября, 18:50
0
Абстрактность классов существует для одного и только для одного. для отрицания возможности создания экземпляров класса. например, когда класс описывает сущность в предметной области, которая существует (извините за тавтологию) только в сознании проектировщика, но не существует в реальности. из избитых примеров: сущность фигура, т.е. абстракция "геометрическая фигура" представить себе можно, но нарисовать на бумаге абстрактную фигуру не выйдет, получится по крайней мере что-то поддающееся классификации. для описания такой сущности и существуют абстрактные классы.
Leonid Levchenko
Leonid Levchenko 2019, 25 сентября, 16:51
0
Абстрактные классы в основном используются в том случае, если какую-то часть кода можно описать в дочернем классе, но для того чтоб эта часть приобрела смысл, нужна конкретика: дополнить общую картину подробностями в виде методов или полей. Если вы присмотритесь к абстрактным классам в современных фреймворках, то увидите что сам по себе абстрактный класс не имеет смысла. Например, если создать объект такого класса оператором new, то этому объекту всё равно будет чего-то не хватать и именно это что-то и добавляют конкретные классы.
Seroga Proga
Seroga Proga 2019, 25 сентября, 15:45
0
Интерфейс - это контракт, который реализовывает класс, а пользователи класса знают как этот класс использовать. Это альтернатива множественному наследованию. Например у вас есть два типа коллекции: бинарное дерево и граф. Это довольно отличающиеся структуры данных. Но каждая из коллекций может реализовать интерфейс Iterator и в этом случае интерпретатор будет знать как перебрать коллекцию в цикле foreach.
Artur Voznesenskij
Artur Voznesenskij 2019, 25 сентября, 15:28
0
Да, носят чисто декларативный характер. Но в проектировании и при разработке в команде разработчиков очень сильно нужен. Например, у нас есть некая сущность Тариф, от которой порождены конкретные реализации (Акционный, лимитный, безлимитный, специальный - не суть ) - их может что-то объединять/разделять.

IT Новости

Смотреть все