Funkcije i postupci važan su dio Delfi jezika. Počevši s Delphijem 4, Delphi nam omogućava rad s funkcijama i postupcima koji podržavaju zadane parametre (izradu parametri izborno) i dopušta da dvije ili više rutina imaju identičan naziv, ali djeluju kao potpuno različiti rutine.
Pogledajmo kako Preopterećenje i zadani parametri mogu vam pomoći kod boljeg kodiranja.
preopterećenje
Jednostavno rečeno, preopterećenje izjavljuje više od jedne rutine s istim nazivom. Preopterećenje nam omogućuje da imamo više rutina koje imaju isti naziv, ali s različitim brojem parametara i vrsta.
Kao primjer, razmotrimo sljedeće dvije funkcije:
{Preopterećena rutina mora biti proglašena. s direktivom o preopterećenju}funkcija SumAsStr (a, b: cijeli broj): niz; preopterećenje; početi Rezultat: = IntToStr (a + b); kraj; funkcija SumAsStr (a, b: prošireno; Brojke: cijeli broj): niz; preopterećenje; početi Rezultat: = FloatToStrF (a + b, ffFixed, 18, znamenke); kraj;
Ove deklaracije stvaraju dvije funkcije, obje nazvane SumAsStr, koje uzimaju različit broj parametara i dvije su različite vrste. Kad nazovemo preopterećenu rutinu, prevoditelj mora biti u stanju reći koju rutinu želimo pozvati.
Na primjer, SumAsStr (6, 3) poziva prvu funkciju SumAsStr, jer su njezini argumenti cjelobrojni.
Bilješka: Delphi će vam pomoći da odaberete pravu implementaciju uz pomoć dovršetka koda i uvida u kôd.
S druge strane, razmotrimo pokušajmo li nazvati SumAsStr funkciju na sljedeći način:
SomeString: = SumAsStr (6.0,3.0)
Primit ćemo pogrešku koja glasi: "ne postoji preopterećena verzija 'SumAsStr' koja se može nazvati ovim argumentima."To znači da treba uključiti i parametar Digits koji se koristi za određivanje broja znamenki nakon decimalne točke.
Bilješka: Za pisanje preopterećenih rutina postoji samo jedno pravilo, a to je da se preopterećena rutina mora razlikovati u najmanje jednoj vrsti parametra. Umjesto toga, tip povratka se ne može koristiti za razlikovanje dviju rutina.
Dvije jedinice - jedna rutinska
Recimo da imamo jednu rutinu u jedinici A, a jedinica B koristi jedinicu A, ali deklarira rutinu s istim nazivom. Deklaracija u jedinici B ne treba direktivu o preopterećenju - trebali bismo koristiti naziv jedinice A da bismo kvalificirali pozive na A verziju rutine iz jedinice B.
Razmislite o nečem takvom:
jedinica B;... namjene A;... postupak RoutineName; početi Rezultat: = A.RutineName; kraj;
Alternativa korištenju preopterećenih rutina je upotreba zadanih parametara, što obično rezultira sa manje koda za pisanje i održavanje.
Zadani / neobavezni parametri
Kako bismo pojednostavili neke izjave, možemo dati zadanu vrijednost parametru funkcije ili postupka, a rutinu možemo nazvati sa ili bez parametra, čineći ga opcionalnim. Da biste osigurali zadanu vrijednost, završavajte deklaraciju parametra s simbolom jednakim (=), a slijedi stalni izraz.
Na primjer, s obzirom na deklaraciju
funkcija SumAsStr (a, b: prošireno; Brojke: cijeli broj = 2): niz;
sljedeći pozivi funkcija su ekvivalentni.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Bilješka: Parametri sa zadanim vrijednostima moraju se pojaviti na kraju popisa parametara i moraju ih prenijeti kao vrijednost ili kao const. Referentni (var) parametar ne može imati zadanu vrijednost.
Kada pozivamo rutine s više zadanih parametara, ne možemo preskočiti parametre (kao u VB):
funkcija SkipDefParams (var Žica; B: cijeli broj = 5, C: boolean = netočno): boolean;... // ovaj poziv generira poruku o pogrešci
CantBe: = SkipDefParams ('delphi',, istina);
Preopterećenje zadanim parametrima
Kada koristite preopterećenje parametara funkcije i postupka i zadane parametre, nemojte uvoditi dvosmislene rutinske deklaracije.
Razmotrite sljedeće izjave:
postupak DoIt (A: produženo; B: cijeli broj = 0); preopterećenje; postupak DoIt (A: produženo); preopterećenje;
Poziv na DoIt postupak poput DoIt (5.0), ne kompilira se. Zbog zadanog parametra u prvom postupku ova izjava može nazvati oba postupka, jer je nemoguće odrediti koji se postupak poziva.