Toiminnot ja menettelyt ovat tärkeä osa delfi-kieltä. Alkaen Delphi 4: stä, Delphi antaa meille mahdollisuuden työskennellä toimintojen ja menettelyjen kanssa, jotka tukevat oletusparametreja (tekemällä parametrit valinnainen), ja sallii kahden tai useamman rutiinin olevan saman nimen, mutta toimivat täysin erilaisina rutiinit.
Katsotaan, kuinka ylikuormitus ja oletusparametrit voivat auttaa sinua koodaamaan paremmin.
Ylikuormitus
Yksinkertaisesti sanottuna ylikuormitus ilmoittaa useamman kuin yhden rutiinin samalla nimellä. Ylikuormitus antaa meille mahdollisuuden useisiin rutiineihin, joilla on sama nimi, mutta joilla on eri määrä parametreja ja tyyppejä.
Tarkastellaan esimerkiksi seuraavia kahta toimintoa:
{Ylikuormitetut rutiinit on ilmoitettava. ylikuormitusdirektiivin kanssa}toimia SumAsStr (a, b: kokonaisluku): jono; ylikuormittaa; alkaa Tulos: = IntToStr (a + b); end; toimia SumAsStr (a, b: laajennettu; Numerot: kokonaisluku): jono; ylikuormittaa; alkaa Tulos: = FloatToStrF (a + b, ffFixed, 18, numeroa); pää;
Nämä ilmoitukset luovat kaksi toimintoa, kumpaakin nimeltään SumAsStr, jotka ottavat eri määrän parametreja ja ovat kahta erityyppistä. Kun soitamme ylikuormitetusta rutiinista, kääntäjän on kyettävä kertomaan mihin rutiiniin haluamme soittaa.
Esimerkiksi SumAsStr (6, 3) kutsuu ensimmäistä SumAsStr-funktiota, koska sen argumentit ovat kokonaislukuja.
Huomautus: Delphi auttaa sinua valitsemaan oikean toteutuksen koodin loppuunsaattamisen ja koodiohjauksen avulla.
Toisaalta harkitse, yritämmekö kutsua SumAsStr-toimintoa seuraavasti:
SomeString: = SumAsStr (6.0,3.0)
Saamme virheen, jonka lukee: "ei ole ylikuormitettua 'SumAsStr' -versiota, jota voidaan kutsua näillä argumenteilla."Tämä tarkoittaa, että meidän pitäisi sisältää myös Digits-parametri, jota käytetään numeroiden määrän määrittämiseen desimaalin jälkeen.
Huomautus: Ylikuormitettujen rutiinien kirjoittamisessa on vain yksi sääntö, eli ylikuormitetun rutiinin on oltava erilainen ainakin yhdessä parametrityypissä. Palautustyyppiä sen sijaan ei voida käyttää erottamaan kaksi rutiinia.
Kaksi yksikköä - yksi rutiini
Oletetaan, että meillä on yksi rutiini yksikössä A ja yksikkö B käyttää yksikköä A, mutta ilmoittaa rutiinin samalla nimellä. Yksikön B ilmoitus ei tarvitse ylikuormitusdirektiiviä - meidän tulisi käyttää yksikön A nimeä saadaksemme kutsut A: n rutiiniversioon yksiköstä B.
Mieti jotain tällaista:
yksikkö B;... käyttötarkoitukset A;... menettely RoutineName; alkaa Tulos: = A.RoutineName; pää;
Vaihtoehto ylikuormitettujen rutiinien käyttämiselle on käyttää oletusparametreja, mikä johtaa yleensä vähemmän koodin kirjoittamiseen ja ylläpitämiseen.
Oletus / valinnaiset parametrit
Joidenkin lauseiden yksinkertaistamiseksi voimme antaa oletusarvon toiminnon tai proseduurin parametrille ja voimme kutsua rutiinia parametrilla tai ilman, tekemällä siitä valinnaisen. Oletusarvon saamiseksi lopeta parametrien ilmoittaminen symbolilla equ (=), jota seuraa vakiolauseke.
Esimerkiksi annettu ilmoitus
toimia SumAsStr (a, b: laajennettu; Numerot: kokonaisluku = 2): jono;
Seuraavat funktiokutsut ovat vastaavia.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Huomautus: Oletusarvoja sisältävien parametrien on tapahduttava parametriluettelon lopussa, ja niiden on välitettävä arvolla tai const. Viiteparametrilla (var) ei voi olla oletusarvoa.
Soitettaessa rutiineja, joissa on useampi kuin yksi oletusparametri, emme voi ohittaa parametreja (kuten VB: ssä):
toimia SkipDefParams (var Nauha; B: kokonaisluku = 5, C: looginen = väärä): looginen;... // tämä puhelu aiheuttaa virheilmoituksen
CantBe: = SkipDefParams ('delphi', totta);
Ylikuormitus oletusparametreilla
Kun käytät sekä funktion tai proseduurin ylikuormitusta että oletusparametreja, älä ota käyttöön moniselitteisiä rutiini-ilmoituksia.
Harkitse seuraavia julistuksia:
menettely Tee (A: laajennettu; B: kokonaisluku = 0); ylikuormittaa; menettely Tee (A: laajennettu); ylikuormittaa;
Kutsu DoIt (5.0) -kutsu DoIt-menettelyyn, ei käänny. Ensimmäisen proseduurin oletusparametrin takia tämä lause voi kutsua molemmat proseduurit, koska on mahdotonta sanoa, mitä proseduuria on tarkoitus kutsua.