输入扩展名

如果派生类型既没有 bind 属性也没有 sequence 属性,则它是可扩展的。这种类型可以通过其他类型扩展。

module mod

  type base_type
    integer i
  end type base_type

  type, extends(base_type) :: higher_type
    integer j
  end type higher_type

end module mod

声明类型为 base_type 的多态变量与 higher_type 类型兼容,可以将其作为动态类型

class(base_type), allocatable::obj
allocate(obj, source=higher_type(1,2))

类型兼容性通过一系列子项下降,但类型可能只扩展另一种类型。

扩展派生类型从父级继承类型绑定过程,但可以覆盖它

module mod

  type base_type
  contains
    procedure::sub => sub_base
  end type base_type

  type, extends(base_type) :: higher_type
  contains
    procedure::sub => sub_higher
  end type higher_type

contains

  subroutine sub_base(this)
    class(base_type) this
  end subroutine sub_base

  subroutine sub_higher(this)
    class(higher_type) this
  end subroutine sub_higher

end module mod

program prog
  use mod

  class(base_type), allocatable::obj

  obj = base_type()
  call obj%sub

  obj = higher_type()
  call obj%sub

end program