Как вызвать метод суперкласса из подкласса, если этот суперкласс содержит отложенные методы в фортране? - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь создать родительский класс с двумя дочерними подклассами.Родительский класс будет содержать хотя бы один отложенный метод и хотя бы один неотложенный метод.

Родительский класс

      TYPE, ABSTRACT :: parent
      CONTAINS
         PROCEDURE (parent_deferred_method), DEFERRED :: deferred_method
         PROCEDURE :: non_deferred_method => parent_non_deferred_method
      END TYPE

      ABSTRACT INTERFACE
         FUNCTION parent_deferred_method(this)
            IMPORT
            CLASS (parent), INTENT(in) :: this
            INTEGER                    :: parent_deferred_method
         END FUNCTION
      END INTERFACE

      CONTAINS

      FUNCTION parent_non_deferred_method(this)
         CLASS (parent), INTENT(in) :: this
         INTEGER                    :: parent_non_deferred_method

         parent_non_deferred_method = 1
      END FUNCTION

Поскольку у меня есть отложенный метод,Мне нужно сделать родительский тип абстрактным.Теперь я хочу определить два дочерних класса.Один дочерний элемент не будет переопределять метод без отсрочек родительского класса.

Дочерний 1 класс

      TYPE, EXTENDS(parent) :: child1
      CONTAINS
         PROCEDURE :: deferred_method => child1_deferred_method
      END TYPE

      CONTAINS

      FUNCTION child1_deferred_method(this)
         CLASS (child1), INTENT(in) :: this
         INTEGER                    :: child1_deferred_method

         child1_deferred_method = 2
      END FUNCTION

Но другой переопределит.У меня проблема в том, что я хочу, чтобы второй дочерний класс вызвал метод родительского класса.Тем не менее, это дает мне ошибку, так как родительский класс ABSTRACT.

Дочерний класс 2

      TYPE, EXTENDS(parent) :: child2
         CONTAINS
         PROCEDURE :: deferred_method => child2_deferred_method
         PROCEDURE :: non_deferred_method => child2_non_deferred_method
      END TYPE

      CONTAINS

      FUNCTION child2_deferred_method(this)
         CLASS (child2), INTENT(in) :: this
         INTEGER                    :: child2_deferred_method

         child2_deferred_method = 3
      END FUNCTION

      FUNCTION child2_non_deferred_method(this)
         CLASS (child2), INTENT(in) :: this
         INTEGER                    :: child2_non_deferred_method

         child2_non_deferred_method = 4 +                                      &
     &      this%parent%non_deferred_method()
      END FUNCTION

Как вызвать метод суперкласса, когда этосуперкласс содержит отложенные методы?

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