Като цяло абстрактният тип е модел за потомствени производни типове. Процедурите, съдържащи се в типа, трябва да бъдат ПУБЛИЧНИ, ако е отложен, тъй като частната не може да бъде препратена или заменена извън самия модул. Но как мога да проектирам производния тип ABSTRACT, ако искам всеки един от наследниците да има една и съща функционална ЧАСТНА процедура, за да направи нещо (напр. Да тества състоянието на инициализация на своя екземпляр)? Трябва ли ръчно да ги дефинирам във всеки потомък или мога да поставя модел в АБСТРАКТ и да го внедря в потомъка? Ето един пример:
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 по-горе е невалиден. Какво трябва да направя ?