Functies en procedures zijn een belangrijk onderdeel van de taal Delphi. Beginnend met Delphi 4, stelt Delphi ons in staat om te werken met functies en procedures die standaardparameters ondersteunen (waardoor de parameters optioneel zijn), en staat toe dat twee of meer routines een identieke naam hebben maar als volledig verschillende routines werken.
Laten we eens kijken hoe overbelasting en standaardparameters u kunnen helpen om beter te coderen.
Simpel gezegd, overbelasting verklaart meer dan één routine met dezelfde naam. Door overbelasting kunnen we meerdere routines hebben die dezelfde naam hebben, maar met een ander aantal parameters en typen.
Laten we als voorbeeld de volgende twee functies bekijken:
Overbelaste routines moeten worden aangegeven met de overbelastingsrichtlijn functie SumAsStr (a, b: geheel getal): draad; overbelasten; beginnen Resultaat: = IntToStr (a + b); einde; functie SumAsStr (a, b: uitgebreid; cijfers: geheel getal): draad; overbelasten; beginnen Resultaat: = FloatToStrF (a + b, ffFixed, 18, cijfers); einde;
Deze verklaringen creëren twee functies, beide SumAsStr genoemd, die een verschillend aantal parameters aannemen en van twee verschillende typen zijn. Wanneer we een overbelaste routine aanroepen, moet de compiler kunnen vertellen welke routine we willen aanroepen.
SumAsStr (6, 3) roept bijvoorbeeld de eerste SumAsStr-functie aan, omdat de argumenten een geheel getal hebben.
Notitie: Delphi helpt u de juiste implementatie te kiezen met behulp van code-voltooiing en code-inzicht.
Aan de andere kant, overweeg of we de SumAsStr-functie als volgt proberen aan te roepen:
SomeString: = SumAsStr (6.0,3.0)
We krijgen een foutmelding als volgt: "er is geen overbelaste versie van 'SumAsStr' die met deze argumenten kan worden aangeroepen."Dit betekent dat we ook de parameter Cijfers moeten opnemen die worden gebruikt om het aantal cijfers na de komma op te geven.
Notitie: Er is slechts één regel bij het schrijven van overbelaste routines, en dat is dat een overbelaste routine in ten minste één parametertype moet verschillen. Het retourtype kan in plaats daarvan niet worden gebruikt om onderscheid te maken tussen twee routines.
Laten we zeggen dat we één routine hebben in eenheid A, en eenheid B gebruikt eenheid A, maar verklaart een routine met dezelfde naam. De verklaring in eenheid B heeft geen overbelastingsrichtlijn nodig - we moeten de naam van eenheid A gebruiken om aanroepen naar A's versie van de routine van eenheid B te kwalificeren.
Overweeg zoiets als dit:
eenheid B; ... toepassingen EEN;… procedure RoutineName; beginnen Resultaat: = A.RoutineName; einde;
Een alternatief voor het gebruik van overbelaste routines is het gebruik van standaardparameters, wat meestal resulteert in minder code om te schrijven en te onderhouden.
Om sommige statements te vereenvoudigen, kunnen we een standaardwaarde geven voor de parameter van een functie of procedure, en we kunnen de routine met of zonder de parameter oproepen, waardoor deze optioneel is. Om een standaardwaarde op te geven, eindigt u de parameterdeclaratie met het symbool gelijk (=) gevolgd door een constante uitdrukking.
Bijvoorbeeld, gezien de verklaring
functie SumAsStr (a, b: uitgebreid; cijfers: geheel getal = 2): draad;
de volgende functieaanroepen zijn equivalent.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Notitie: Parameters met standaardwaarden moeten voorkomen aan het einde van de parameterlijst en moeten worden doorgegeven door waarde of als const. Een referentieparameter (var) kan geen standaardwaarde hebben.
Bij het aanroepen van routines met meer dan één standaardparameter kunnen we geen parameters overslaan (zoals in VB):
functie SkipDefParams (var Een draad; B: geheel getal = 5, C: boolean = False): boolean;… // deze oproep genereert een foutmelding CantBe: = SkipDefParams ('delphi',, True);
Wanneer u zowel functie- of procedureoverbelasting als standaardparameters gebruikt, moet u geen dubbelzinnige routineverslagen invoeren.
Overweeg de volgende verklaringen:
procedure DoIt (A: uitgebreid; B: geheel getal = 0); overbelasten; procedure DoIt (A: uitgebreid); overbelasten;
De aanroep van DoIt-procedure zoals DoIt (5.0) compileert niet. Vanwege de standaardparameter in de eerste procedure, kan deze instructie beide procedures oproepen, omdat het onmogelijk is om te bepalen welke procedure moet worden aangeroepen.