Использование Visual Studio 2015 и Intel Visual Fortran 2017.
Я не уверен, действительно ли это то, что вы можете сделать в Фортране или на любом другом языке, но похоже, что это может быть очень полезно для сокращения кода котельной пластины в моем проекте, если есть возможность сделать это или что-то подобное. Я понимаю, что могу просто не знать, что искать.
Как я сейчас это делаю:
Module Example
Type SpecificType_T
real :: x
End Type SpecificType_T
Type, abstract :: List_A
class(*) :: obj
contains
procedure :: getObj => list_getSpecificType
End Type List_A
Type SpecificTypeCollection_T
contains
procedure :: getSpecificType => collection_getSpecificType
End Type SpecificTypeCollection_T
contains
subroutine list_getObj(this, obj)
class(List_A), intent(inout) :: this
class(*), intent(out) :: obj
allocate(obj, source=this%obj)
end subroutine list_getObj
function container_getSpecificType(this) result(st)
class(SpecificTypeCollection_T), intent(in) :: this
type(SpecificType_T) :: st
class(*), allocatable :: obj
select type(obj)
type is(SpecificType_T)
st = obj
end select
end function container_getSpecificType
End Module Example
Program test
use Example
type(SpecificType_T) :: a
type(SpecificTypeCollection_T) :: stc
a = stc%getSpecificType()
end Program test
Ниже приведен пример того, что я хочу сделать (хотя я знаю, что это недопустимо для fortran). По сути, я просто хочу избежать необходимости обертывать каждую функцию абстрактного типа с помощью котла для каждого унаследованного типа.
Module Example
Type SpecificType_T
real :: x
End Type SpecificType_T
Type, abstract :: List_A
class(*) :: obj
contains
procedure :: getObj => list_getSpecificType
End Type List_A
Type SpecificTypeCollection_T
class(SpecificType_T) :: obj
End Type SpecificTypeCollection_T
function list_getObj(this) result(obj)
class(List_A), intent(inout) :: this
class(*), intent(out) :: obj
allocate(obj, source=this%obj)
end function list_getObj
End Module Example
Program test
use Example
type(SpecificType_T) :: a
type(SpecificTypeCollection_T) :: stc
a = stc%getObj()
end Program test
РЕДАКТИРОВАТЬ (для пояснения): В принципе, кажется, что было бы действительно удобно, если бы я мог создать некоторый абстрактный базовый объект с такими процедурами, как push или pop, которые действуют на неограниченное полиморфное поле также в абстрактном объекте, а затем имеют унаследованный тип, который может принудительно применять конкретный производный тип без необходимости создавать оболочки в унаследованном объекте для всех процедур, изменяющих неограниченный полиморфный объект.
Это то, что можно сделать в Фортране, или есть еще одна жизнеспособная альтернатива, о которой я не знаю?
Хороший. Я работаю над примером, но мой фактический код, который я хочу использовать, очень объемный, и я не могу передать данные с него на тот, который подключен к Интернету. Так что это может быть какое-то время.
Некоторые программисты выпускают библиотеки, иллюстрирующие универсальное программирование на Фортране. Вы можете взглянуть, например, на fortran-foss-programmers.github.io/FIAT, чтобы увидеть, как реализовать абстрактные типы данных.

Мне известны отложенные привязки для процедур. Я предполагаю, что я ищу отложенные привязки для поля класса производного типа. Мне не удалось его найти, но раньше я много раз просто не знал, какое слово нужно искать.