Многие библиотеки Eiffel были разработаны до того, как default_create
был добавлен к ANY
с соответствующей семантикой.Это объясняет, почему многие классы базовой библиотеки не используют ее.
Кроме того, процедуры создания могут иметь определенный смысл.Например, make
может создать контейнер, который сравнивает внутренние объекты, используя равенство ссылок, тогда как make_equal
может создать контейнер, который вместо этого использует равенство объектов (это имеет место для HASH_TABLE
, хотя есть дополнительный аргумент для указания ожидаемогочисло элементов, этот аргумент может быть опущен при некотором другом выборе дизайна).В таких случаях default_create
и default_create_equal
будут несимметричными, в то время как make
и make_equal
симметричны, так что конструкция будет более согласованной.
Как вы указали, default_create
не должен нести какого-либо определенного поведения, только некоторые базовые вещи, ожидаемые от всех потомков.
Должен ли default_create
вызываться всеми другими процедурами создания, сильно зависит от проекта.Одним из примеров, где это почти правило, является библиотека «vision» , которая кодирует в default_create
правильный порядок инициализации, критически важный для безопасности void.Еще возможно написать класс (на основе этой библиотеки), который правильно выполняет инициализацию, не вызывая default_create
в своей процедуре создания, но наличие готовых к использованию шаблонов упрощает разработку.