@MitekK

Почему в абстрактном классе ServiceProvider нет ни одного абстрактного метода?

Здравствуйте!

Изучаю Laravel Framework 5.7.15

И на примере класса Illuminate\Support\ServiceProvider возник такой вопрос: какой смысл делать класс абстрактным, если в нем не будет ни одного абстрактного метода?
  • Вопрос задан
  • 465 просмотров
Пригласить эксперта
Ответы на вопрос 2
@MadridianFox
Web-программист, многостаночник
Не скажу за конкретно этот класс, с laravel не работал, но вообще а этом есть смысл.
Абстрактный класс вынуждает нас создавать его дочерние классы, но ещё и содержит какой-то обобщенный код. Сам по себе абстрактный класс как экземпляр бесполезен, т.к. не содержит конкретного кода.
Так вот, когда мы хотим из обобщённого кода вызвать какой-то конкретный код, мы объявляем абстрактный метод.
Но! Когда логика алгоритма подразумевает вызов обобщённого кода из конкретного, абстрактный метод не нужен. Более того, мы заранее не можем сказать какой метод(ы) будет создан. Получается абстрактный класс, с protected методами, который не содержит абстрактных методов.
Делать такой класс не абстрактным, а его методы публичными не вариант, т.к. это провоцирует нарушение инкапсуляции.
Ответ написан
Комментировать
@MitekK Автор вопроса
В общем, вроде разобрался, спасибо за ответы.
В моей голове, действительно, концепции "абстрактный класс" и "абстрактный метод" не существовали друг без друга до сегодняшнего дня.

Попробую дополнить ответ Igor Vorobiov
При таком подходе абстрактный класс предоставляет базовую реализацию какого-либо метода.
Класс-наследник может либо использовать базовый функционал, либо перегрузить метод.
Клиентский код будет зависеть только от абстрактного класса.
Конкретная реализация метода будет определяться во время выполнения - позднее статическое связывание (аналог виртуальных методов).

Как-то так. Или нет? :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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