Фортран ФИНАЛЬНАЯ процедура для типа ABSTRACT
Могу ли я добавить final
процедура к абстрактному типу?
Предположим, что окончательная процедура выглядит следующим образом:
subroutine finalize(this)
type(bin_tree_t), intent(inout) :: this
deallocate(this%head)
end subroutine finalize
Мой компилятор (ifort 18.0.1) выдает "Ошибка № 8313: TYPE(производный-тип-спецификация) не должен указывать абстрактный тип". Я понимаю это, но фиктивный аргумент последней подпрограммы не может быть полиморфным.
Если это невозможно, вероятно, это был сознательный выбор комитета по стандартам или просто недосмотр?
1 ответ
Для абстрактного типа невозможно иметь заключительную подпрограмму. Как вы заметили, аргумент для такой подпрограммы не должен быть полиморфным, и мы не можем создать экземпляр абстрактного типа с type(spec)
,
Когда объект завершен, последняя выбранная подпрограмма - это та, которая имеет тип аргумента - динамический тип объекта, который должен быть завершен. Ни один объект не может иметь динамический тип абстрактный тип. Финальные подпрограммы не наследуются (и не могут быть переопределены).
Я могу вообразить случаи использования, когда заключительная подпрограмма для абстрактного типа была бы хороша. На самом деле, любая финализация, которую мы бы хотели, чтобы абстрактный тип выполнял, должна выполняться расширяющим типом. Обратите внимание, что финализуемые компоненты абстрактного родителя все еще будут доработаны.
Я не могу комментировать мнение комитета по стандартам, но эти случаи, похоже, не имеют большей ценности, чем простая спецификация завершения, которую мы сейчас имеем.
Я сказал, что аргумент в пользу последней подпрограммы не должен быть полиморфным. Это C480 стандарта Fortran 2008. Это вполне разумный вопрос - "какие проблемы вызваны разрешением полиморфного аргумента?".
Процесс финализации, как он есть, не выражает выбранную финальную подпрограмму для сущности с точки зрения общего разрешения, переопределения или наследования. Выбор таков: "Если есть подходящая подпрограмма для динамического типа, возьмите ее". Вместо этого, если были разрешены полиморфные аргументы: "если есть подходящая подпрограмма для динамического типа, возьмите ее; если нет, переберите родительские типы...". Эта последняя концепция не встречается больше нигде.
Обратите внимание, что родительский тип завершается после завершения расширяющего типа (даже если этот расширяющий тип не имеет соответствующей заключительной подпрограммы).
В заключение, мне кажется, что нет активного желания запрещать заключительные подпрограммы для абстрактных типов, но стоимость их разрешения была слишком велика. Нынешний подход довольно просто определен. Может ли финализация написана по-другому? Да. Увы, нам нужен кто-то с более детальными знаниями, чтобы рассказать нам, почему именно этот путь был выбран.