Я попытаюсь очистить некоторые заблуждения, которые, я думаю, у вас есть о механизме субмодулей в Fortran.
Затем я хочу переопределить эти подпрограммы в серии дочерних модулей.
Вы не переопределяете процедур с подмодулями, вы реализуете их.
Идея, которую я понимаю субмодулей состоит в том, что мне не нужно снова объявлять все входы ,
Если под входами вы подразумеваете объявления и подписи процедуры(интерфейсы), тогда да , вам не нужно (но можно) повторить их в подмодулях, но нет , это не назначение субмодулей.
но что если я захочу использовать одну и ту же подпрограмму (например, sub1
) в нескольких подмодулях, где я объявляю разные типы?
Ну, может, мне придетсякратко объясните, что такое подмодули, а какие нет.Для получения более подробной информации, пожалуйста, обратитесь к этой хорошей статье , написанной @SteveLionel, или к этой записи на вики-сайте Fortran, или к справке вашего компилятора (что бы это ни было)или даже в вашей любимой книге по Modern Fortran .
Как я уже говорил в еще один вопрос , подмодули - это функция, добавленная к языку для решения одного конкретного вопроса:разделение интерфейса и реализации.Основной мотивацией были каскады компиляции, генерируемые, когда вам нужно было изменить только детали реализации в модуле.
Подмодуль имеет доступ к сущностям в родительском модуле по ассоциации хоста, но родительский модуль не знает осуществование этого подмодуля.Когда вы объявляете тип Child1
внутри подмодуля ChildModule1
, он доступен только внутри самого этого подмодуля, но не в родительском модуле BaseModule
.
Кроме того, ChildModule1
не являетсямодуль и не может быть use
d, как вы это делаете, в основной программе или любом другом программном модуле.Роль только подмодулей заключается в реализации module procedures
, в котором отсутствует реализация в его родительском модуле.
Подведение итогов: разметка исходных файлов и программных модулей модульным, разумным способоми используйте подмодули , если имеет смысл , чтобы реализации ваших процедур были независимы от их объявлений (что-то вроде c
заголовочных и исходных файлов ... но примите это сравнение с крошкой соли).
Редактировать:
Мне кажется, вы думаете, module
и submodule
в Фортране связаны с классами и подклассами в других языках. Они не! Может быть, это распространенное заблуждение, я не знаю.
Фортран имеет определяемые пользователем типы.Они могут связывать методы, конструкторы и деструкторы, они могут инкапсулировать данные, они могут быть расширены, они могут быть динамически отправлены, они могут быть объявлены абстрактными, они могут откладывать и переопределять члены.Это эквивалентно занятиям на других языках.Вы можете (и это хорошая практика) разделить каждый тип и связанный материал на соответствующие модули.Аналогично, вы можете иметь модуль для каждого типа расширения, если хотите.
Но, опять же, подмодули не имеют к этому никакого отношения.