Здравствуйте, Sharov, Вы писали:
S>Скорее всего унаследуюсь от TR, но агрегирую SR, ибо надо позицию учитывать. Как-то так.
Ну, агрегировать (декорировать) надо скорее TextReader, потому что иначе у вас не будет возможности применить ваши наработки к альтернативным наследникам (например, StringReader). S>>Это простое упражнение помогает прояснить различия между агрегацией, наследованием реализации, и наследованием интерфейса.
S>Мне казалось, я эту разницу понимаю.
Ну, вот как раз тут и начинаются всякие интересные приплызды. Скажем, невозможно не отнаследоваться от TextReader — не существует интерфейса, который можно было бы реализовать при помощи прямого потомка object.
TextReader тащит за собой довольно-таки толстую реализацию, отказаться от которой вы не можете. Ещё в нём есть всякие неочевидные зависимости — повторюсь: какие методы вы будете перекрывать? Сможете сказать, не глядя в исходники? Как там с асинхронщиной — будет унаследованная реализация вам помогать или мешать? Может быть, вам захочется запретить асинхронное использование вашего декоратора — ан нет, нельзя, нет такого способа.
И это ещё относительно хорошо продуманный базовый класс. Специально разработанный для того, чтобы от него наследовались.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.