Этот дизайн действительно восходит к Smalltalk, который я бы рассматривал в основном как попытку добиться ориентации объекта за счет почти любых других проблем. Как таковой, он имеет тенденцию (на мой взгляд) использовать объектную ориентацию, даже когда другие методы, вероятно (или даже наверняка) превосходят.
Наличие единственной иерархии с Object
(или чем-то похожим) в корне позволяет довольно легко (для одного примера) создавать классы коллекций в виде коллекций Object
, поэтому тривиально для коллекции содержать любой тип объекта.
В обмен на это довольно незначительное преимущество вы получаете целый ряд недостатков. Во-первых, с точки зрения дизайна вы получите действительно безумные идеи. По крайней мере, согласно взгляду Вселенной на Java, что общего между Атеизмом и Лесом? Что у них обоих есть хэш-коды! Является ли карта коллекцией? По словам Java, нет, это не так!
В 70-х, когда разрабатывался Smalltalk, такая чепуха была принята, прежде всего потому, что никто не придумал разумной альтернативы. Smalltalk был завершен в 1980 году, а к 1983 году была разработана Ada (которая включает в себя дженерики). Хотя Ада так и не достигла той популярности, которую некоторые предсказывали, ее обобщений было достаточно для поддержки коллекций объектов произвольных типов - без безумия, присущего монолитным иерархиям.
При разработке Java (и, в меньшей степени, .NET) монолитная иерархия классов, вероятно, рассматривалась как «безопасный» выбор - с проблемами, но в основном с известными проблемами. Родовое программирование, напротив, было тем, что почти все (даже тогда) поняли, было, по крайней мере, теоретически гораздо лучшим подходом к проблеме, но тот, который многие коммерчески ориентированные разработчики считали довольно плохо изученным и / или рискованным (то есть в коммерческом мире). Ада была в основном отклонена как провал).
Позвольте мне быть предельно ясным: монолитная иерархия была ошибкой. Причины этой ошибки были, по крайней мере, понятны, но в любом случае это была ошибка. Это плохой дизайн, и его проблемы с дизайном пронизывают почти весь код, использующий его.
Однако для нового дизайна сегодня нет разумного вопроса: использование монолитной иерархии - явная ошибка и плохая идея.
object
Отчасти в фреймворке .NET есть корень, потому что он предоставляет некоторые базовые возможности для всех объектов, таких какToString()
иGetHashCode()