Funktsioonid ja protseduurid on delfide keele oluline osa. Alustades Delphi 4-st, võimaldab Delphi meil töötada funktsioonidega ja protseduuridega, mis toetavad vaikeparameetreid (muutes DOS-i) parameetrid pole kohustuslikud) ja võimaldab kahel või enamal rutiinil olla identne nimi, kuid toimida täiesti erinevana rutiin.
Vaatame, kuidas ülekoormamine ja vaikeparameetrid aitavad teil paremat koodi kodeerida.
Ülekoormamine
Lihtsamalt öeldes - ülekoormamine kuulutab mitu samanimelist rutiini. Ülekoormamine võimaldab meil kasutada mitut rutiini, millel on sama nimi, kuid erineva arvu parameetrite ja tüüpidega.
Vaatleme näiteks kahte järgmist funktsiooni:
{Ülekoormatud rutiinid tuleb deklareerida. koos ülekoormusdirektiiviga}funktsiooni SumAsStr (a, b: täisarv): nöör; ülekoormus; alustada Tulemus: = IntToStr (a + b); lõpp; funktsiooni SumAsStr (a, b: laiendatud; Numbrid: täisarv): nöör; ülekoormus; alustada Tulemus: = FloatToStrF (a + b, ffFixed, 18, numbrit); lõpp;
Need deklaratsioonid loovad kaks funktsiooni, mõlemat nimega SumAsStr, millel on erinev arv parameetreid ja mis on kahte tüüpi. Kui nimetame ülekoormatud rutiini, peab koostaja oskama öelda, millist rutiini me tahame kutsuda.
Näiteks kutsub SumAsStr (6, 3) esimese SumAsStr-funktsiooni, kuna selle argumente hinnatakse täisarvuga.
Märge: Delphi aitab teil koodi valmimise ja koodi tundmise abil valida õige rakenduse.
Teiselt poolt kaaluge, kas proovime funktsiooni SumAsStr kutsuda järgmiselt:
SomeString: = SumAsStr (6.0,3.0)
Saame vea, mis on järgmine: "pole ühtegi 'SumAsStr' ülekoormatud versiooni, mida saaks nende argumentidega kutsuda."See tähendab, et me peaksime lisama ka parameetri Digits, mida kasutatakse komakohajärgse numbrite arvu täpsustamiseks.
Märge: Ülekoormatud rutiinide kirjutamisel on ainult üks reegel ja see tähendab, et ülekoormatud rutiin peab erinema vähemalt ühe parameetri tüübi osas. Tagastamise tüüpi ei saa selle asemel kasutada kahe rutiini eristamiseks.
Kaks ühikut - üks rutiinne
Oletame, et meil on üks rutiin ühikus A ja üksus B kasutab ühikut A, kuid deklareerib samanimelise rutiini. B-ühiku deklaratsioon ei vaja ülekoormusdirektiivi - üksuse B rutiini versioonile helistamise kvalifitseerimiseks peaksime kasutama üksuse A nime.
Mõelge millelegi sellisele:
ühik B;... kasutab A;... protseduur Rutiinne nimi; alustada Tulemus: = A.RoutineName; lõpp;
Ülekoormatud rutiinide kasutamise alternatiiv on vaikimisi parameetrite kasutamine, mille tulemuseks on tavaliselt vähem koodi kirjutamine ja hooldamine.
Vaike- / valikulised parameetrid
Mõne avalduse lihtsustamiseks võime anda funktsiooni või protseduuri parameetrile vaikimisi väärtuse ja kutsuda rutiini parameetriga või ilma, muutes selle valikuliseks. Vaikeväärtuse andmiseks lõpetage parameetri deklareerimine sümboliga võrdne (=), millele järgneb konstantne avaldis.
Näiteks arvestades deklaratsiooni
funktsiooni SumAsStr (a, b: laiendatud; Numbrid: täisarv = 2): nöör;
järgmised funktsioonikõned on samaväärsed.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Märge: Vaikeväärtustega parameetrid peavad ilmuma parameetrite loendi lõpus ja neid tuleb edastada väärtuse või konstantsena. Viiteparameetril (var) ei saa olla vaikeväärtust.
Kui helistate rutiinidele, millel on rohkem kui üks vaikeparameeter, ei saa me parameetreid vahele jätta (nagu VB-s):
funktsiooni SkipDefParams (var A: nöör; B: täisarv = 5, C: loogiline = vale): loogiline;... // see kõne genereerib tõrketeate
CantBe: = SkipDefParams ('delphi', tõsi);
Ülekoormamine vaikeparameetritega
Nii funktsiooni kui protseduuri ülekoormamise ja vaikeparameetrite kasutamisel ärge sisestage mitmetähenduslikke rutiinseid deklaratsioone.
Mõelge järgmistele deklaratsioonidele:
protseduur Tee (A: laiendatud; B: täisarv = 0); ülekoormus; protseduur Tee (A: pikendatud); ülekoormus;
Kõne DoIt protseduuri nagu DoIt (5.0) ei kompileeri. Esimese protseduuri vaikeparameetri tõttu võib see avaldus kutsuda mõlemat protseduuri, kuna on võimatu öelda, millist protseduuri nimetatakse.