Категория: Веб

В чём разница между абстрактным классом и интерфейсом?

В чём разница между абстрактным классом и интерфейсом?

Наследование

Одним из основных различий между интерфейсом и абстрактным классом является наследование - класс может реализовывать много интерфейсов, но наследовать только одного родителя.

Многократное наследование классов - это функциональность, которая вообще невозможна во многих языках программирования. Почему? Потому что это порождает больше проблем, чем пользы.
Когда у класса много родителей, и в каждом из них есть метод с одинаковым объявлением, нам нужно определять, какой из них нас интересует. С таким кодом будет сложно работать, потому что нужно тщательно вникать в него во время возможных изменений, чтобы случайно не испортить что-либо.

Однако, если наследование классов является плохим, почему вы можете реализовать несколько интерфейсов?
Причина проста - интерфейс основан на функциональности, а класс основан на реализации. Таким образом, даже если мы реализуем десять интерфейсов, и каждый из них имеет одно и то же объявление одного метода, они не мешают друг другу. Интерфейс является гарантией его существования, а не как он должен быть реализован.

Видимость методов

Все методы, объявленные в интерфейсе, являются публичными, а методы, объявленные в классах, могут быть как публичными так и защищенными.

Интерфейс является гарантией функциональности, гарантией того, что класс, реализующий его, будет иметь определенные методы. Поэтому в интерфейсе могут появляться только публичные объявления.

Декларация

Интерфейс может содержать только объявления методов, а абстрактный класс также может содержать реализацию определенных методов.

Это вытекает непосредственно из того факта, что интерфейс фокусируется на предоставлении определенных функциональных возможностей, в то время как абстрактный класс также может быть основан на сходстве в реализации производных классов.

Константы

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

Атрибуты

Абстрактные классы могут содержать атрибуты, а интерфейсы - нет. Причина та же, что и для объявлений и определений методов.

Итоги

В дополнение к перечислению различий между интерфейсом и абстрактным классом я попытался объяснить, откуда они берутся, что это не только изобретение создателей объектно-ориентированного языка, но оно напрямую вытекает из идеи самих конструкций.

Я надеюсь, что я ничего не забыл, но если это так, напишите в комментариях, и я постараюсь исправиться :)