Подмена составляющих

Подкласс может подменять или перекрывать (override) составляющую суперкласса, определяя составляющую с тем же именем внутри себя. Подменяющая составляющая (подкласса) уточняет и заменяет подмененную (суперкласса в подклассе). Подмена составляющих может потребоваться по нескольким причинам: для спецификации поведения, зависящего от подкласса, для уточнения спецификации составляющей, для повышения производительности. Например, на рис. 23 каждый подкласс-лист должен реализовать операцию display, несмотря на то, что она определена в классе Figure. Класс Circle повышает производительность, подменяя операцию rotate пустым блоком кода.

Подменять можно методы и значения по умолчанию для атрибутов. Никогда не следует подменять сигнатуру составляющей. Подмена должна сохранять тип атрибута, количество и тип аргументов операции, а также тип возвращаемого операцией значения. Уточнение типа атрибута или аргумента операции (то есть указание в качестве типа подтипа исходного типа) является формой ограничения и должно использоваться с осторожностью. Часто подмена используется для повышения производительности. В этом случае универсальный метод подменяется специальным, который использует имеющиеся дополнительные сведения, но не изменяет семантику операции (например, Circle.rotate на рис. 23).

Никогда не следует подменять составляющую, если в результате она окажется несогласованной с унаследованной от предка составляющей. Подкласс является частным случаем суперкласса и должен быть совместим с ним во всех отношениях. К сожалению, на практике объектно-ориентированные программисты часто заимствуют класс, похожий на тот, который им нужен, а затем изменяют его, модифицируя или игнорируя его составляющие, несмотря на то, что новый класс перестает быть частным случаем исходного класса. Такие действия могут приводить к концептуальным ошибкам и появлению скрытых предположений в программах.