Современный Фортран: Вызов процедуры предка от потомка - PullRequest
2 голосов
/ 29 марта 2019

Я начинаю использовать функции OO в Modern Fortran и уже знаком с OO на других языках. В Delphi (Object Pascal) обычно вызывается версия процедуры-предка в ее переопределенной дочерней процедуре, и есть даже выражение языка «унаследовано», которое позволяет это. Я не могу найти эквивалентную конструкцию Фортрана - но, вероятно, ищу не ту вещь. Смотрите простой пример ниже. Любой совет высоко ценится.

type tClass
  integer :: i
contains
  procedure Clear => Clear_Class
end type tClass

type tSubClass
  integer :: j
contains
  procedure Clear => Clear_SubClass
end type tSubClass

subroutine Clear_Class
  i = 0
end subroutine

subroutine Clear_SubClass
  inherited Clear ! this is the Delphi way
  j = 0
end subroutine

1 Ответ

2 голосов
/ 29 марта 2019

Вот пример кода, который пытается реализовать комментарий @HighPerformanceMark (то есть дочерний тип имеет скрытый компонент, который ссылается на родительский тип).

module testmod
    implicit none

    type tClass
        integer :: i = 123
    contains
        procedure :: Clear => Clear_Class
    endtype

    type, extends(tClass) :: tSubClass
        integer :: j = 456
    contains
        procedure :: Clear => Clear_SubClass
    endtype

contains

    subroutine Clear_Class( this )
        class(tClass) :: this
        this % i = 0
    end

    subroutine Clear_SubClass( this )
        class(tSubClass) :: this
        this % j = 0
        call this % tClass % Clear()  !! (*) calling a method of the parent type
    end
end

program main
    use testmod
    implicit none
    type(tClass) :: foo
    type(tSubClass) :: subfoo

    print *, "foo (before) = ", foo
    call foo % Clear()
    print *, "foo (after)  = ", foo

    print *, "subfoo (before) = ", subfoo
    call subfoo % Clear()
    print *, "subfoo (after)  = ", subfoo
end

который дает (с гфортраном-8,2)

 foo (before) =          123
 foo (after)  =            0
 subfoo (before) =          123         456
 subfoo (after)  =            0           0

Если мы закомментируем строку, отмеченную (*), subfoo % i останется неизменной:

 foo (before) =          123
 foo (after)  =            0
 subfoo (before) =          123         456
 subfoo (after)  =          123           0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...