1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| module calculator_mod implicit none
type, abstract :: Calculator contains procedure :: initialize => initialize_default procedure(calculator_step_one), deferred :: stepOne procedure(calculator_step_two), deferred :: stepTwo procedure :: finalize => finalize_default procedure :: runProcess end type Calculator
abstract interface subroutine calculator_step_one(this) import :: Calculator class(Calculator) :: this end subroutine calculator_step_one
subroutine calculator_step_two(this) import :: Calculator class(Calculator) :: this end subroutine calculator_step_two end interface
contains
subroutine initialize_default(this) class(Calculator) :: this print *, "Initializing Calculator" end subroutine initialize_default
subroutine finalize_default(this) class(Calculator) :: this print *, "Finalizing Calculator" end subroutine finalize_default
subroutine runProcess(this) class(Calculator) :: this
call this%initialize() call this%stepOne() call this%stepTwo() call this%finalize() end subroutine runProcess
end module calculator_mod
module add_multiply_calculators_mod use calculator_mod implicit none
type, extends(Calculator) :: AddCalculator integer :: num1, num2 contains procedure :: stepOne => add_step_one procedure :: stepTwo => add_step_two end type AddCalculator
type, extends(Calculator) :: MultiplyCalculator integer :: num1, num2 contains procedure :: stepOne => multiply_step_one procedure :: stepTwo => multiply_step_two end type MultiplyCalculator
contains
subroutine add_step_one(this) class(AddCalculator) :: this
this%num1 = 5 this%num2 = 3 print *, "Adding numbers: ", this%num1, " + ", this%num2, " = " end subroutine add_step_one
subroutine add_step_two(this) class(AddCalculator) :: this print *, this%num1 + this%num2 end subroutine add_step_two
subroutine multiply_step_one(this) class(MultiplyCalculator) :: this
this%num1 = 5 this%num2 = 3 print *, "Multiplying numbers: ", this%num1, " * ", this%num2, " = " end subroutine multiply_step_one
subroutine multiply_step_two(this) class(MultiplyCalculator) :: this print *, this%num1 * this%num2 end subroutine multiply_step_two
end module add_multiply_calculators_mod
program main use calculator_mod use add_multiply_calculators_mod implicit none
class(Calculator), pointer :: addCalc, mulCalc
allocate(AddCalculator :: addCalc) allocate(MultiplyCalculator :: mulCalc)
call addCalc%runProcess() call mulCalc%runProcess()
deallocate(addCalc) deallocate(mulCalc)
end program main
|