Delphi-metodöverbelastning och standardparametrar

Funktioner och procedurer är en viktig del av Delphi-språket. Från och med Delphi 4 tillåter Delphi oss att arbeta med funktioner och procedurer som stöder standardparametrar (vilket gör parametrarna valfria), och tillåter två eller flera rutiner att ha ett identiskt namn men fungerar som helt olika rutiner.

Låt oss se hur överbelastning och standardparametrar kan hjälpa dig att koda bättre.

överbelastning

Enkelt uttryckt förklarar överbelastning mer än en rutin med samma namn. Överbelastning tillåter oss att ha flera rutiner som har samma namn, men med ett annat antal parametrar och typer.

Låt oss som exempel överväga följande två funktioner:

 Överbelastade rutiner måste deklareras med överbelastningsdirektivet fungera SumAsStr (a, b: heltal): sträng; överbelastning; Börja    Resultat: = IntToStr (a + b); slutet; fungera SumAsStr (a, b: utökat; siffror: heltal): sträng; överbelastning; Börja    Resultat: = FloatToStrF (a + b, ffFixed, 18, siffror); slutet; 

Dessa deklarationer skapar två funktioner, båda kallade SumAsStr, som tar ett annat antal parametrar och är av två olika typer. När vi kallar en överbelastad rutin måste kompilatorn kunna berätta vilken rutin vi vill ringa.

Exempelvis anropar SumAsStr (6, 3) den första SumAsStr-funktionen, eftersom dess argument är heltal.

Notera: Delphi hjälper dig att välja rätt implementering med hjälp av kodfyllning och kodinsikt.

Å andra sidan, överväga om vi försöker kalla SumAsStr-funktionen enligt följande:

 SomeString: = SumAsStr (6.0,3.0) 

Vi får ett fel som lyder: "det finns ingen överbelastad version av 'SumAsStr' som kan kallas med dessa argument."Detta betyder att vi också bör inkludera siffran Parametern som används för att ange antalet siffror efter decimalpunkten.

Notera: Det finns bara en regel när man skriver överbelastade rutiner, och det är att en överbelastad rutin måste skilja sig åt i åtminstone en parametertyp. Returtypen kan istället inte användas för att skilja mellan två rutiner.

Två enheter - en rutin

Låt oss säga att vi har en rutin i enhet A, och enhet B använder enhet A, men förklarar en rutin med samma namn. Förklaringen i enhet B behöver inte överbelastningsdirektivet - vi bör använda enhet A: s namn för att kvalificera samtal till A: s version av rutinen från enhet B.

Tänk på något liknande:

 enhet B; ... användningar A; ... procedur RoutineName; Börja   Resultat: = A.RoutineName; slutet; 

Ett alternativ till att använda överbelastade rutiner är att använda standardparametrar, vilket vanligtvis resulterar i mindre kod att skriva och underhålla.

Standard / valfria parametrar

För att förenkla vissa uttalanden kan vi ge ett standardvärde för parametern för en funktion eller procedur, och vi kan ringa rutinen med eller utan parametern, vilket gör det valfritt. För att tillhandahålla ett standardvärde, avsluta parameterdeklarationen med symbolen lika (=) följt av ett konstant uttryck.

Till exempel med tanke på deklarationen

 fungera SumAsStr (a, b: utökad; siffror: heltal = 2): sträng; 

följande funktionssamtal är likvärdiga.

 SumAsStr (6.0, 3.0) 
 SumAsStr (6.0, 3.0, 2) 

Notera: Parametrar med standardvärden måste inträffa i slutet av parameterlistan och måste skickas efter värde eller som const. En referensparameter (var) kan inte ha ett standardvärde.

När vi ringer rutiner med mer än en standardparameter, kan vi inte hoppa över parametrar (som i VB):

 fungera SkipDefParams (var A: string; B: heltal = 5, C: booleskt = falskt): booleskt; ... // detta samtal genererar ett felmeddelande CantBe: = SkipDefParams ('delphi',, True); 

Överbelastning med standardparametrar

När du använder både överbelastning av funktioner eller procedurer och standardparametrar ska du inte införa tvetydiga rutinedeklarationer.

Tänk på följande förklaringar:

 procedur DoIt (A: förlängd; B: heltal = 0); överbelastning; procedur DoIt (A: utökad); överbelastning; 

Samtalet till DoIt-proceduren som DoIt (5.0) sammanställs inte. På grund av standardparametern i den första proceduren kan detta uttalande anropa båda procedurerna, eftersom det är omöjligt att säga vilken procedur som är tänkt att anropas.