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