Funksjoner og prosedyrer er en viktig del av Delphi-språket. Fra og med Delphi 4 lar Delphi oss arbeide med funksjoner og prosedyrer som støtter standardparametere (gjør parametre valgfritt), og gjør at to eller flere rutiner har et identisk navn, men fungerer som helt forskjellige rutiner.
La oss se hvordan overbelastning og standardparametere kan hjelpe deg med å kode bedre.
overbelastning
Enkelt sagt erklærer overbelastning mer enn en rutine med samme navn. Overbelastning gjør at vi kan ha flere rutiner som har samme navn, men med et annet antall parametere og typer.
La oss som et eksempel vurdere følgende to funksjoner:
{Overbelastede rutiner må deklareres. med overbelastningsdirektivet}funksjon SumAsStr (a, b: heltall): string; overbelastning; begynne Resultat: = IntToStr (a + b); slutt; funksjon SumAsStr (a, b: utvidet; Sifre: heltall): string; overbelastning; begynne Resultat: = FloatToStrF (a + b, ffFixed, 18, sifre); slutt;
Disse deklarasjonene lager to funksjoner, begge kalt SumAsStr, som tar et annet antall parametere og er av to forskjellige typer. Når vi kaller en overbelastet rutine, må kompilatoren kunne fortelle hvilken rutine vi vil ringe.
For eksempel kaller SumAsStr (6, 3) den første SumAsStr-funksjonen, fordi dens argumenter er heltallsverdier.
Merk: Delphi vil hjelpe deg med å velge riktig implementering ved hjelp av kodeutfylking og kodeinnsikt.
På den annen side bør du vurdere om vi prøver å kalle SumAsStr-funksjonen som følger:
SomeString: = SumAsStr (6.0,3.0)
Vi får en feil som lyder: "det er ingen overbelastet versjon av 'SumAsStr' som kan kalles med disse argumentene."Dette betyr at vi også bør inkludere sifferparameteren som brukes til å spesifisere antall sifre etter desimalet.
Merk: Det er bare en regel når du skriver overbelastede rutiner, og det er at en overbelastet rutine må avvike i minst en parametertype. Returtypen kan i stedet ikke brukes til å skille mellom to rutiner.
To enheter - en rutine
La oss si at vi har en rutine i enhet A, og enhet B bruker enhet A, men erklærer en rutine med samme navn. Erklæringen i enhet B trenger ikke overbelastningsdirektivet - vi bør bruke enhet As navn for å kvalifisere anrop til As versjon av rutinen fra enhet B.
Tenk på noe som dette:
enhet B;... bruker EN;... fremgangsmåte RoutineName; begynne Resultat: = A.RoutineName; slutt;
Et alternativ til å bruke overbelastede rutiner er å bruke standardparametere, noe som vanligvis resulterer i mindre kode å skrive og vedlikeholde.
Standard / valgfrie parametere
For å forenkle noen utsagn, kan vi gi en standardverdi for parameteren til en funksjon eller prosedyre, og vi kan ringe rutinen med eller uten parameteren, noe som gjør den valgfri. For å gi en standardverdi, avslutter du parameterdeklarasjonen med det likne (=) symbolet etterfulgt av et konstant uttrykk.
For eksempel gitt erklæringen
funksjon SumAsStr (a, b: utvidet; Sifre: heltall = 2): string;
følgende funksjonssamtaler er likeverdige.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Merk: Parametere med standardverdier må forekomme på slutten av parameterlisten, og må sendes med verdi eller som const. En referanseparameter (var) kan ikke ha en standardverdi.
Når du ringer rutiner med mer enn en standardparameter, kan vi ikke hoppe over parametere (som i VB):
funksjon SkipDefParams (Var En streng; B: heltall = 5, C: boolsk = falsk): boolsk;... // denne samtalen genererer en feilmelding
CantBe: = SkipDefParams ('delphi', sant);
Overbelastning med standardparametere
Ikke bruk tvetydige rutinedeklarasjoner når du bruker både overbelastning av funksjon eller prosedyre og standardparametere.
Vurder følgende erklæringer:
fremgangsmåte Gjør (A: utvidet; B: heltall = 0); overbelastning; fremgangsmåte Gjør (A: utvidet); overbelastning;
Samtalen til DoIt-prosedyren som DoIt (5.0) kompileres ikke. På grunn av standardparameteren i den første prosedyren, kan dette utsagnet kalle begge prosedyrene, fordi det er umulig å si hvilken prosedyre som er ment å bli kalt.