Syntax:
INTERFACE [gattung] [[...] FUNCTION func_name [....] deklarationsteil END [FUNCTION [func_name]]] [[...] SUBROUTINE sub_name [....] deklarationsteil END [SUBROUTINE [sub_name]]] [MODULE PROCEDURE modul_up_name [modul_up_name]] END INTERFACE
Gattungsnamen oder generische Namen fassen mehrere Unterprogramme zusammen, wobei es dann von den Aktualparametern abhängt, welches aufgerufen wird:
INTERFACE swap SUBROUTINE iswap (a,b) INTEGER :: a,b END SUBROUTINE SUBROUTINE swap (a,b) REAL :: a,b END SUBROUTINE swap SUBROUTINE dswap (a,b) DOUBLE PRECISION :: a,b END END INTERFACE
Benutzerdefinierte Operatoren sind Operatoren im üblichen Sinn und können vordefinierte Operatoren auch überladen:
INTERFACE OPERATOR (+) FUNCTION addstring (a,b) IMPLICIT NONE CHARACTER (LEN=LEN(TRIM(ADJUSTL(a)))+LEN(TRIM(ADJUSTL(b)))) :: addstring CHARACTER (LEN=*), INTENT(IN) :: a, b END FUNCTION END INTERFACEwobei die Funktion addstring z.B. wie folgt aussehen könnte:
CHARACTER FUNCTION addstring (a,b) IMPLICIT NONE CHARACTER (LEN=LEN(TRIM(ADJUSTL(a)))+LEN(TRIM(ADJUSTL(b)))) :: addstring CHARACTER (LEN=*), INTENT(IN) :: a, b addstring = TRIM(ADJUSTL(a))//TRIM(ADJUSTL(b)) END FUNCTION
Benutzerdefinierte Wertzuweisungen überladen die vordefinierte Wertzuweisung (=) mit einer benutzerdefinierten Funktion:
INTERFACE ASSIGNMENT (=) SUBROUTINE my_len_trim (lang, a) IMPLICIT NONE INTEGER, INTENT(OUT) :: lang CHARACTER (LEN=*), INTENT(IN) :: a END END INTERFACEund ein azupassendes Unterprogramm könnte folgendermaßen aussehen:
SUBROUTINE my_len_trim (lang, a) IMPLICIT NONE INTEGER, INTENT(OUT) :: lang CHARACTER (LEN=*), INTENT(IN) :: a lang = LEN_TRIM(ADJUSTL(a)) END SUBROUTINEDer Aufruf dieser SUBROUTINE erfolgt durch
... CHARACTER*80 :: text INTEGER :: laenge ... laenge = text ...