通过使用接口来重载类型名称,可以为派生类型创建自定义构造函数。这样,在构造该类型的对象时,可以使用不对应于组件的关键字参数。
module ball_mod implicit none ! only export the derived type, and not any of the ! constructors themselves private public :: ball type :: ball_t real :: mass end type ball_t ! Writing an interface overloading 'ball_t' allows us to ! overload the type constructor interface ball_t procedure :: new_ball end interface ball_t contains type(ball_t) function new_ball(heavy) logical, intent(in) :: heavy if (heavy) then new_ball%mass = 100 else new_ball%mass = 1 end if end function new_ball end module ball_mod program test use ball_mod implicit none type(ball_t) :: football type(ball_t) :: boulder ! sets football%mass to 4.5 football = ball_t(4.5) ! calls 'ball_mod::new_ball' boulder = ball_t(heavy=.true.) end program test
与使用单独的初始化例程相比,它可以用于制作更整洁的API:
subroutine make_heavy_ball(ball) type(ball_t), intent(inout) :: ball ball%mass = 100 end subroutine make_heavy_ball ... call make_heavy_ball(boulder)