Я бы не назвал абстрактные классы абстрактными по следующей причине:
Каждый Прямоугольник - это Форма . Везде, где вы можете использовать форму, вы можете использовать прямоугольник. Код, который имеет дело с прямоугольником (но может также иметь дело с кругами) может выглядеть так:
Shape s = .....;
s.drawTo(myGraphicsContext);
Использование объекта (например, прямоугольника) везде, где вы можете использовать его обобщение (например, форму), является важной частью объектно-ориентированной концепции и известно как принцип подстановки Лискова . (Также очевидно: какого рода предложение или логика будут делать утверждения о формах, но тогда не будут применяться к прямоугольникам?)
Если вы называете обобщение AbstractShape , этот принцип нарушается. Прямоугольник не является абстрактной формой. Во всяком случае, это «конкретная форма»! Прямоугольник не является абстрактным (в смысле «я не знаю, что это за форма. Это может быть прямоугольник, может быть что-нибудь еще»). Код, использующий AbstractShape, читается неправильно:
AbstractShape s = new Rectangle(...);
Я написал в блоге больше мыслей на эту тему здесь .