Как правило, абстрактный тип является моделью для производных типов-потомков. Процедуры, содержащиеся в этом типе, должны быть ОБЩЕСТВЕННЫМИ, если они отложены, потому что на PRIVATE нельзя ссылаться или переопределять из самого модуля. Но как я могу спроектировать АБСТРАКТНЫЙ производный тип, если я хочу, чтобы каждый из потомков имел одну и ту же функциональную процедуру PRIVATE для выполнения каких-либо действий (например, для проверки статуса инициализации его экземпляра)? Должен ли я вручную определять их в каждом потомке или я могу поместить модель в РЕФЕРАТ и реализовать ее в потомке? Вот пример:
module test1
implicit none
private
public :: my_numeric_type
type, abstract :: my_numeric_type
contains
private
procedure(op2), deferred :: add
procedure(op2), deferred :: subtract
generic, public :: operator(+) => add
generic, public :: operator(-) => subtract
end type my_numeric_type
abstract interface
function op2(a, b) result(r)
import :: my_numeric_type
class(my_numeric_type), intent(in) :: a, b
class(my_numeric_type), allocatable :: r
end function op2
end interface
end module test1
module test2
use test1, only: my_numeric_type
implicit none
type, extends(my_numeric_type) :: my_integer
private
integer :: value
contains
private
procedure, public :: add => add_my_integer
procedure, public :: subtract => subtract_my_integer
end type my_integer
contains
function add_my_integer(a, b) result(r)
class(my_integer), intent(in) :: a
class(my_numeric_type), intent(in) :: b
class(my_numeric_type), allocatable :: r
! DO SOME ADDITION.
end function add_my_integer
function subtract_my_integer(a, b) result(r)
class(my_integer), intent(in) :: a
class(my_numeric_type), intent(in) :: b
class(my_numeric_type), allocatable :: r
! DO SOME SUBTRACTION.
end function subtract_my_integer
end module test2
В примере производный тип-потомок my_integer не является абстрактным типом и наследует отложенную привязку, поэтому процедуры (сложение и вычитание) должны быть переопределены. Но процедуры определены как закрытые в my_numeric_type, то есть их нельзя переопределить вне модуля test1, поэтому указанный выше тип my_integer недействителен. Что я должен делать ?