Полиморфизм Фортрана (перегрузка поля?)

Использование 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, которые действуют на неограниченное полиморфное поле также в абстрактном объекте, а затем имеют унаследованный тип, который может принудительно применять конкретный производный тип без необходимости создавать оболочки в унаследованном объекте для всех процедур, изменяющих неограниченный полиморфный объект.

Это то, что можно сделать в Фортране, или есть еще одна жизнеспособная альтернатива, о которой я не знаю?

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

QuantumDebris 28.08.2018 17:41

Хороший. Я работаю над примером, но мой фактический код, который я хочу использовать, очень объемный, и я не могу передать данные с него на тот, который подключен к Интернету. Так что это может быть какое-то время.

QuantumDebris 28.08.2018 18:18

Некоторые программисты выпускают библиотеки, иллюстрирующие универсальное программирование на Фортране. Вы можете взглянуть, например, на fortran-foss-programmers.github.io/FIAT, чтобы увидеть, как реализовать абстрактные типы данных.

Pierre de Buyl 29.08.2018 19:29
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
1
3
96
0

Другие вопросы по теме