Полиморфизм Фортрана (перегрузка поля?) - PullRequest
0 голосов
/ 28 августа 2018

Использование 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

Ниже приведен пример того, что я хочу сделать (хотя я знаю, что это недопустимый фортран). По сути, я просто хочу избежать необходимости оборачивать каждую функцию абстрактного типа табличкой котла для каждого унаследованного типа.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...