😱 Абстрактный класс и интерфейс
Проходя тех интервью в WildBerries рекрутер задал мне весьма интересный вопрос:
В чём отличие абстрактного класса и интерфейса
Вопрос весьма интересный, так что я решил написать краткую заметку на эту тему.
Абстрактный класс - это класс, который не может быть создан в виде объекта, он используется для создания классов-наследников, которые могут наследовать его свойства и методы. Абстрактный класс может содержать как абстрактные методы, так и реализованные методы. Абстрактные методы не имеют тела и должны быть реализованы в классах-наследниках.
Интерфейс - это набор методов и свойств, которые должны быть реализованы в классах, которые реализуют этот интерфейс. Интерфейс не содержит реализации методов, только их сигнатуры. Класс, который реализует интерфейс, обязан реализовать все методы, которые описаны в интерфейсе.
А теперь остановимся на каждом поподробнее.
Абстрактный класс
Не может быть использован для создания объектов, но может содержать методы и свойства, которые наследуются дочерними классами. Он определяет общие свойства и методы для классов, которые наследуют его, и может содержать некоторую общую реализацию, которая будет использоваться в наследниках.
Абстрактный класс может содержать абстрактные методы, которые не имеют определения в самом классе, но должны быть реализованы в наследниках. Также абстрактный класс может содержать обычные методы и свойства, которые могут использоваться как в абстрактном классе, так и в его наследниках.
Абстрактный класс можно использовать для создания иерархии классов с общими свойствами и методами, но без определения их реализации.
Это упрощает и ускоряет процесс создания новых классов, так как наследникам не нужно заново описывать общие свойства и методы, они могут просто наследовать их от абстрактного класса.
Интерфейс
Интерфейс в ООП (объектно-ориентированном программировании) - это абстрактный класс, который содержит только абстрактные методы и константы, но не имеет реализации. Интерфейс определяет набор методов, которые должны быть реализованы в классе-наследнике.
Интерфейсы определяют общие методы, которые должны быть реализованы в классах, но не задают конкретной реализации. Таким образом, интерфейсы обеспечивают гибкость в проектировании приложений и позволяют классам реализовывать один и тот же интерфейс, но с различными реализациями.
Заключение
Отличие между абстрактным классом и интерфейсом заключается в том, что абстрактный класс может содержать реализованные методы, а интерфейс - только сигнатуры методов.