Я слышал, что это «сложно» «спроектировать для наследования», но я никогда не обнаруживал, что это так. Может ли кто-нибудь (и кем-либо, я имею в виду Джона Скита) объяснить, почему это якобы сложно, каковы подводные камни / препятствия / проблемы, и почему простые смертные программисты не должны пытаться это делать и просто закрывают свои классы для защиты невинных?
Хорошо, я шучу о последнем, но мне любопытно узнать, действительно ли у кого-то (включая Джона) есть трудности с «проектированием для наследования». Я действительно никогда не считал это проблемой, но, возможно, я упускаю из виду то, что я считаю само собой разумеющимся - или что-то напортачил, не осознавая этого!
РЕДАКТИРОВАТЬ: спасибо за все отличные ответы до сих пор. Я полагаю, что консенсус заключается в том, что для типичных классов приложений (подклассы WinForm, одноразовые служебные классы и т. Д.) Нет необходимости рассматривать повторное использование любого вида, тем более повторное использование через наследование, в то время как для библиотечных классов критически важно рассмотреть повторное использование через наследование в дизайне.
Я, на самом деле, не думаю, скажем, о классе WinForm для реализации диалога с графическим интерфейсом, как о классе, который кто-то может использовать повторно - я как бы думаю об этом как об одноразовом объекте. Но технически это класс, и кто-то может унаследовать его, но это маловероятно.
Большая часть крупномасштабных разработок, которые я сделал, - это библиотеки классов для базовых библиотек и фреймворков, поэтому разработка для повторного использования по наследованию была критической - я просто никогда не думал, что это "сложно", просто был . ; -)
Но я также никогда не рассматривал это в отличие от «одноразовых» классов для общих задач приложений, таких как WinForms и др.
Больше советов и подводных камней проектирования наследования приветствуются, конечно; Я тоже попробую добавить.