На этой неделе я исследовал абстрактные классы и методы. Впервые я создал абстрактный класс на работе, когда создал базовый класс Animal, от которого унаследованы разные классы животных, такие как Lion, cat и dog. Имя базового класса было абстрактным классом под названием Animal.

Причины для создания абстрактного класса:

  1. Если мы создадим базовый класс как конкретный, не абстрактный класс, ничто не помешает нам создать экземпляр базового класса. Создание класса как абстрактного запрещает нам создавать новый экземпляр базового абстрактного класса.
  2. Мы хотим создать абстрактный класс, когда хотим переместить общую функциональность двух или более связанных классов в базовый класс и когда мы не хотим, чтобы этот базовый класс создавался.
  3. Вы можете заставить ваши унаследованные классы использовать методы, которые вы хотите, чтобы они использовали.
  4. Ваши дочерние классы могут переопределять виртуальные или абстрактные методы внутри вашего абстрактного класса.

Абстракция против интерфейса

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

  1. Абстрактный класс может иметь реализацию для некоторых своих членов (методов), но интерфейс не может иметь реализацию ни для одного из своих членов.
  2. Интерфейсы не могут иметь полей там, где абстрактные классы могут иметь поля.
  3. Класс может наследовать многие интерфейсы, но не классы.
  4. Абстрактный класс может иметь модификаторы доступа, тогда как интерфейсы не могут иметь модификаторов.

Еще не запутались? Есть больше.

Во время исследования я заметил, что код, который разработчик написал в базовом классе Animal, имел виртуальные методы, которые позже были переопределены моими дочерними классами.

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

Между абстрактными методами внутри абстрактных классов и виртуальными методами внутри абстрактных классов есть некоторые ключевые различия.

  1. Абстрактные методы не имеют реализации и ДОЛЖНЫ быть переопределены.
  2. Виртуальные методы МОГУТ иметь реализацию, но не являются обязательными, и их можно переопределить.
  3. вы не можете вызывать base.method() для абстрактных, но можете для виртуальных методов.

Существует гораздо больше информации об абстрактных классах и методах. Это все, что мне удалось изучить на этой неделе.