В ОО-мире абстрактные классы используются для наложения некоторых ограничений дизайна и реализации.Ничего более.Вы никогда не должны использовать абстрактные классы в любом случае.Но могут быть случаи, когда вам лучше наложить эти ограничения.Так что же они?Давайте посмотрим на это, сравнив его oo-аналоги.
Абстрактные классы и интерфейсы
Как вы знаете, это две основные концепции наследования.
По сути, интерфейс используется только для того, чтобы объявить, что вы готовы наследовать базовый сервис, и все.Не содержит реализации и не имеет функциональности.В этом смысле интерфейс является абстрактным.Вот почему это скорее ограничение дизайна, чем ограничение реализации.Подумайте о разъеме для наушников на динамике.В каждом наушнике должен быть реализован интерфейс разъема (с методами start, stop, listen, turnDown, turnUp).Каждый наушник должен переопределять этот интерфейс, чтобы наследовать функциональные возможности, которые предоставляет динамик, и реализовывать его соответствующим образом.
С другой стороны, абстрактные классы могут включать методы с реализацией.Это основное отличие, и в этом смысле оно может использовать больше, чем интерфейс.Кроме того, они могут содержать закрытые, защищенные и нестатические поля, которые вы не можете через интерфейсы.Вы можете заставить подклассы реализовывать некоторые обязательные функции с абстрактными методами (без реализаций).Абстрактные классы более гибкие, чем интерфейсы.
Конечно, не говоря уже о том, что вы можете расширить только один класс в Java, где вы можете реализовать несколько интерфейсов.
Абстрактные классы против обычных классов
Так почему бы тогда не использовать обычные классы.В чем преимущество использования абстрактного класса?Это довольно просто.Если вы используете абстрактные классы, вы заставляете основную функциональность быть реализованной братьями и сестрами.Как разработчик, вам не нужно помнить, что вы должны реализовать основные функции.Здесь абстрактные классы накладывают ограничения на дизайн над обычными классами.Кроме того, делая абстрагирование класса, вы избегаете случайного создания этого (неполного) класса.