На этой неделе я исследовал абстрактные классы и методы. Впервые я создал абстрактный класс на работе, когда создал базовый класс Animal, от которого унаследованы разные классы животных, такие как Lion, cat и dog. Имя базового класса было абстрактным классом под названием Animal.
Причины для создания абстрактного класса:
- Если мы создадим базовый класс как конкретный, не абстрактный класс, ничто не помешает нам создать экземпляр базового класса. Создание класса как абстрактного запрещает нам создавать новый экземпляр базового абстрактного класса.
- Мы хотим создать абстрактный класс, когда хотим переместить общую функциональность двух или более связанных классов в базовый класс и когда мы не хотим, чтобы этот базовый класс создавался.
- Вы можете заставить ваши унаследованные классы использовать методы, которые вы хотите, чтобы они использовали.
- Ваши дочерние классы могут переопределять виртуальные или абстрактные методы внутри вашего абстрактного класса.
Абстракция против интерфейса
В моем списке выше номер 3 говорил о том, как абстрактный класс может заставить ваши дочерние классы использовать методы, которые вы хотите, чтобы они использовали. Это может звучать как создание интерфейса. Хотя абстрактные классы и интерфейсы могут действовать одинаково, между ними есть некоторые ключевые различия.
- Абстрактный класс может иметь реализацию для некоторых своих членов (методов), но интерфейс не может иметь реализацию ни для одного из своих членов.
- Интерфейсы не могут иметь полей там, где абстрактные классы могут иметь поля.
- Класс может наследовать многие интерфейсы, но не классы.
- Абстрактный класс может иметь модификаторы доступа, тогда как интерфейсы не могут иметь модификаторов.
Еще не запутались? Есть больше.
Во время исследования я заметил, что код, который разработчик написал в базовом классе Animal, имел виртуальные методы, которые позже были переопределены моими дочерними классами.
Однако в учебных пособиях, которые я смотрел, использовались абстрактные методы внутри абстрактных классов, которые были переопределены дочерним классом.
Между абстрактными методами внутри абстрактных классов и виртуальными методами внутри абстрактных классов есть некоторые ключевые различия.
- Абстрактные методы не имеют реализации и ДОЛЖНЫ быть переопределены.
- Виртуальные методы МОГУТ иметь реализацию, но не являются обязательными, и их можно переопределить.
- вы не можете вызывать base.method() для абстрактных, но можете для виртуальных методов.
Существует гораздо больше информации об абстрактных классах и методах. Это все, что мне удалось изучить на этой неделе.