Идея перегрузки, приведенная в примерах C ++, реализована в Фортране, начиная с обобщений из Фортрана 90.
С учетом набора специфических процедуры, общий идентификатор может быть использован для идентификации этого набора.В этом ответе я дам очень общее введение в эту концепцию.Есть много тонкостей, которые могут потребовать дальнейшего чтения / вопросов для решения.
В отличие от примера C ++, наши специфичные для Fortran процедуры должны называться отдельно.Давайте две функции (третья может быть добавлена mutatis mutandis )
integer function volume_cube(s)
integer, intent(in) :: s
...
end function volume_cube
double precision function volume_cylinder(r, h)
double precision, intent(in) :: r
integer, intent(in) :: h
...
end function volume_cylinder
Затем мы можем добавить универсальный интерфейс для чего-то под названием volume
:
interface volume
procedure volume_cube, volume_cylinder
end interface
Затем мы можем сослаться на универсальный volume
, и компилятор определит, какую конкретную функцию использовать.
Существует гораздо больше информации о дженериках, включая то, что они предлагают помимо этой простой перегрузки.Следует также понимать, как решаются конкретные процедуры (простые в этом случае, а не в других) и ограничения, на которых конкретные процедуры могут быть объединены.Поскольку вы используете дженерики, проблемные случаи могут вызывать определенные вопросы.Я отвечаю здесь только потому, что не вижу вводного вопроса, и я не пытаюсь ответить на множество различных трудностей или ценностей.
Полный пример
module mod
private
interface volume
module procedure volume_cube, volume_cylinder
end interface volume
public volume
contains
integer function volume_cube(s)
integer, intent(in) :: s
volume_cube = s**3
end function volume_cube
double precision function volume_cylinder(r, h)
double precision, intent(in) :: r
integer, intent(in) :: h
volume_cylinder = 3.1415926d0*r**2*h
end function volume_cylinder
end module mod
use mod
print*, volume(2), volume(2d0,4)
end