Kurzes Beispiel:
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:
| unit Unit1;
interface
function Unit1Test(x : Integer) : string; implementation
uses Unit2;
function Unit1Test(x : Integer) : string; begin if x = 0 then Result := 'Unit1Test' else Result := Unit2Test(x); end;
unit Unit2;
interface
function Unit2Test(x : Integer) : string;
implementation
uses Unit1;
function Unit2Test(x : Integer) : string; begin if x = 0 then Result := Unit1Test(x); else Result := 'Unit2Test'; end; |
Der Compiler prüft beim Compilieren, ob die Typen zueinander passen, also ob du eine Funktion, die einen Integer erwartet,
auch mit einem Integer aufrufst. Dafür muss er allerdings nur die Signatur kennen. Diese wird bei * a * definiert.
Die Implementation, also der eigentliche Code der Funktion (* b *) muss keiner Typenprüfung nach außen hin standhalten. Da muss
nur intern alles stimmen. Also müssen vor dem jeweiligen Benutzen der anderen Funktionen die Signaturen bekannt sein, damit der
Compiler bei * c * prüfen kann, ob du die Funktion korrekt aufrufst.
Dass erreicht man damit, indem man die Units gegenseitig im Implementation-Teil einbindet, da hier dann einfach nur die Signaturen geschrieben werden müssen.
Ich hoffe es ist klarer geworden
