Идея наследования для обобщения диаметрально противоположна наследованию для специализации. В этой форме подкласс модифицирует родительский класс для создания более общей сущности. Иными словами, вместо роли «подтипа» подкласс
458 Глава 16. Объектно-ориентированное и аспектно-ориентированное программирование
претендует на роль «надтипа». Обобщение обычно применяется, если иерархия классов создается на основе существующих классов, которые нецелесообразно или просто нельзя изменять.
Будем считать, что имеется родительский класс ДиалоговоеОкно. Программистов вполне устраивает набор его методов, но появилась необходимость изменять цвет букв и цвет фона. Для этого надо добавить два атрибута цвет_пера и цвет_фона и переопределить родительский метод отобразить(), обеспечив в нем возможность работы с атрибутами цвета. В результате такой доработки появляется подкласс ЦветноеДиалоговоеОкно. Присвоить ему сертификат подтипа, увы, нельзя. Хотя, как мы увидим в дальнейшем, можно организовать такое переопределение метода, когда «невозможное станет возможным».
Отметим одну особенность: по большому счету, поведение подкласса, обеспечиваемое набором методов, сохранилось на уровне родительского, изменился лишь набор используемых атрибутов. Это типичная особенность наследования для обобщения.
Как правило, обобщений стараются избегать (если есть такая возможность). В нашем примере для этого достаточно «инвертировать ситуацию»: слегка изменить иерархию и содержание классов в библиотеке, подняв «цветовое решение» наверх.