В мире OO абстрактные классы накладывали некоторые ограничения на дизайн и реализацию. Больше ничего. Вам никогда не придется использовать абстрактные классы в любом случае. Но могут быть случаи, когда вам лучше наложить эти ограничения. Так что же это такое? Давайте посмотрим, сравнив его оо-аналоги.
Абстрактные классы и интерфейсы
Как вы знаете, это две основные концепции наследования.
По сути, интерфейс используется только для того, чтобы объявить, что вы хотите наследовать базовую службу, и все. Не содержит реализации и не имеет функциональности. В этом смысле интерфейс абстрактен. Вот почему это больше ограничение дизайна, чем ограничение реализации. Подумайте о разъеме для наушников на динамике. В каждом наушнике должен быть реализован интерфейс разъема (с методами start, stop, listen, TurnDown, TurnUp). Каждый наушник должен переопределить этот интерфейс, чтобы наследовать функциональные возможности, предоставляемые динамиком, и реализовывать их соответствующим образом.
Абстрактные классы, с другой стороны, могут включать методы с реализацией. Это основное отличие, и в этом смысле он может использовать повторное использование не только интерфейса. Кроме того, они могут содержать частные, защищенные и нестатические поля, которые вы не можете использовать через интерфейсы. Вы можете заставить подклассы реализовать некоторые обязательные функции с помощью абстрактных методов (без реализации). Абстрактные классы более гибкие, чем интерфейсы.
Конечно, не говоря уже о том, что вы можете расширить только один класс в java, в котором вы можете реализовать несколько интерфейсов.
Абстрактные классы и обычные классы
Так почему бы тогда не использовать обычные классы. В чем преимущество использования абстрактного класса? Это довольно просто. Если вы используете абстрактные классы, вы заставляете основные функции реализовываться дочерними элементами. Как разработчик, вам не нужно помнить, что вы должны реализовать основные функции. Именно здесь абстрактные классы накладывают ограничения на дизайн по сравнению с обычными классами. Кроме того, делая класс абстрактным, вы избегаете случайного создания этого (неполного) класса.
person
stdout
schedule
10.11.2015