Супервызовов в исходниках среды довольно немного. Точно так же, как относительно немного и наследования реализации - только в заготовках Framework, и то - типы с реализацией всё равно сделаны абстрактными.

Проблема наследования реализации много раз обсуждалась - в компонентном ПО возникают проблемы: хрупкого базового класса и т.п., это описано у Пфистера в "Компонентом ПО". В системном программировании следует избегать использования наследования реализации, использовать только гомогенные иерархии наследования (абстрактный тип-интерфейс - конкретное расширение-реализация, неэкспортируемое). И так не только в КП, такой подход является основой многих ООП-паттернов (в частности, рекомендуется в книге Гаммы и др. "Паттерны объектно-ориентированного проектирования", построенной на Smalltalk и С++, живым примером которой является, тем не менее, BlackBox).

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

Примеры таких решений - паттерны Model-View-Controller, фирменно-блэкбоксовый Carrier-Rider-Mapper.
А в подсистеме Text вообще выделено больше типов, чем модель-отображение-диспетчер: ещё и Mappers, Setters - отвечающий за вёрстку на странице, Rulers... Всегда достаточно переписать только один из этих типов, да и то не обязательно целиком - можно просто обернуть стандартную реализацию, заменяя некоторые вызовы, а остальные делегируя обёрнутому объекту...