A delphi alapjai

Túlterhelési eljárások és funkciók
Bizonyos esetekben szükség van olyan alprogramokra írni, amelyek ugyanazokat a logikai műveleteket hajtják végre, hanem különböző típusú adatok változóit. Például:

eljárás IncrementInteger (var Érték: Integer);
eljárás IncrementReal (var Érték: Real);

A Delphi-ben két vagy több eljárás (függvényt) adhat meg ugyanazokkal az azonosítóval, feltéve, hogy minden ilyen eljárás (függvény) különbözik a paraméterek listájában. Ezt a lehetőséget túlterhelésnek nevezik. Annak jelzésére, hogy az eljárás (funkció) túlterhelt, a szabványos túlterhelési irányt használják. Segítségével a fenti példa átírható a következőképpen:

eljárás növelése (var értéke: egész); túlterhelés // eljárás 1
eljárás növelése (var érték: valós); túlterhelés // eljárás 2

Milyen típusú eljárást kell alkalmazni ebben a esetben, a fordító a program összeállításakor meghatározza a híváson átadott tényleges érvek típusát.

var
X: Integer;
Y: Valódi;
kezdődik
X: = 1;
Y: = 2,0;
Növekmény (X); // Hívási eljárás 1
Növekmény (Y); // Hívási eljárás 2
végén.

Túlterhelés esetén az eljárások és a funkciók egész szám adattípusokkal társulnak. Tegyük fel, hogy két eljárás létezik:

eljárás Nyomtatás (X: Shortint); túlterhelés // eljárás 1
eljárás Nyomtatás (X: Longint); túlterhelés // eljárás 2

Ha megpróbáljuk a nyomtatási eljárást úgy definiálni, hogy az egészérték állandó tényező, akkor azt látjuk, hogy az eljárás opció kiválasztása a fordítótól függ az állandó értékétől.

Nyomtatás (5); // Hívási eljárás 1
Nyomtatás (150); // Hívási eljárás 2
Nyomtatás (-500); // Hívási eljárás 2
Nyomtatás (-1); // Hívási eljárás 1

Nyilvánvaló, hogy ugyanaz a szám lehet Longint és Shortint (például az 5-ös és -1-es szám). A fordító logika ilyen esetekben: ha a tényleges paraméter értéke többféle típusú tartományba esik, amelyen túlterhelés történik, akkor a fordító kiválaszt egy olyan eljárást (függvényt), amelynek paramétertípusának kisebb értéktartománya van. Például a Print (5) hívása azt jelenti, hogy az eljárás egy olyan változatát hívja fel, amelynek a Shortint paramétertípusa van. De a Print (150) hívása azt jelenti, hogy az eljárás variánsát hívjuk fel, amely a Longint paraméter típusával rendelkezik, mert a 150-es szám nem illeszkedik a Shortint adattípus értéktartományába.

Mivel a Delphi környezet jelenlegi verziójában a gazdag adattípusú Integer ugyanaz, mint az alapvető Longint adattípus, a következő túlterhelési opció helytelen:

eljárás Nyomtatás (X: Integer); túlterhelés
eljárás Nyomtatás (X: Longint); túlterhelés // Hiba!

Ugyanaz a hiba akkor fordul elő, ha egyéni alaptípus által meghatározott egyéni adattípusokat használ.

típus
TMyInteger = Integer;

eljárás Nyomtatás (X: Integer); túlterhelés
eljárás Nyomtatás (X: TMyInteger); túlterhelés // Hiba!

Mi a teendő olyan esetekben, amikor ilyen túlterhelés egyszerűen szükséges? Ehhez létre kell hoznia egy egyéni adattípust a típusú kulcsszóval:

típus
TMyInteger = típus Integer;

eljárás Nyomtatás (X: Integer); túlterhelés
eljárás Nyomtatás (X: TMyInteger); túlterhelés / Helyesen

Meg kell jegyezni, hogy ha olyan túlterhelt eljárásokat (függvényeket) használ, amelyek paraméterei normál értékekkel rendelkeznek, akkor nagyon óvatosnak kell lenni, mert előfordulhatnak olyan helyzetek, amikor a fordító egyszerűen nem tudja, hogy melyik eljárást (funkciót) akarja hívni. Például:

eljárás növelése (var érték: valós; delta: valós = 1,0); túlterhelés // eljárás 1
eljárás növelése (var érték: valós); túlterhelés // eljárás 2

Az Increment eljárás egy paraméterrel történő megnevezése kétértelműséget okozhat:

var
X: Valódi;
kezdődik
Növekmény (X, 10); // Hívási eljárás 1
Növekmény (X); // Hiba! kétértelműség
végén.

Ugyancsak tilos a túlterhelés funkciók, amelyek csak a visszatérési érték típusában különböznek.

SquareRoot (X: Integer) funkció: Single; túlterhelés
SquareRoot (X: Integer) funkció: Double; túlterhelés // Hiba!

Kapcsolódó cikkek