Funkce a postupy jsou důležitou součástí jazyka Delphi. Počínaje Delphi 4, Delphi nám umožňuje pracovat s funkcemi a procedurami, které podporují výchozí parametry (takže parametry nepovinné) a umožňuje dvěma nebo více rutinám mít stejný název, ale fungovat jako zcela odlišné rutiny.
Podívejme se, jak vám přetížení a výchozí parametry mohou pomoci lépe kódovat.
Přetížení
Jednoduše řečeno, přetížení deklaruje více než jednu rutinu se stejným názvem. Přetížení nám umožňuje mít více rutin, které sdílejí stejný název, ale s jiným počtem parametrů a typů.
Jako příklad uveďme následující dvě funkce:
{Přetížené rutiny musí být deklarovány. se směrnicí o přetížení}funkce SumAsStr (a, b: celé číslo): tětiva; přetížení; začít Výsledek: = IntToStr (a + b); konec; funkce SumAsStr (a, b: rozšířené; Číslice: celé číslo): tětiva; přetížení; začít Výsledek: = FloatToStrF (a + b, ffFixed, 18, číslice); konec;
Tato prohlášení vytvářejí dvě funkce, obě nazývané SumAsStr, které mají různý počet parametrů a jsou dvou různých typů. Když voláme přetíženou rutinu, musí kompilátor vědět, na kterou rutinu chceme volat.
Například SumAsStr (6, 3) volá první funkci SumAsStr, protože její argumenty jsou celočíselné.
Poznámka: Delphi vám pomůže vybrat správnou implementaci pomocí dokončení kódu a nahlédnutí do kódu.
Na druhou stranu zvažte, zda se pokusíme zavolat funkci SumAsStr takto:
SomeString: = SumAsStr (6.0,3.0)
Dostaneme chybu, která zní: "neexistuje žádná přetížená verze 'SumAsStr', kterou lze vyvolat pomocí těchto argumentů."To znamená, že bychom měli také zahrnout parametr Číslice používaný k určení počtu číslic za desetinnou čárkou."
Poznámka: Při psaní přetížených rutin existuje pouze jedno pravidlo, a to, že přetížená rutina se musí lišit alespoň v jednom typu parametru. Typ návratu místo toho nelze použít k rozlišení mezi dvěma rutinami.
Dvě jednotky - jedna rutina
Řekněme, že máme jednu rutinu v jednotce A a jednotka B používá jednotku A, ale deklaruje rutinu se stejným názvem. Prohlášení v jednotce B nevyžaduje směrnici o přetížení - měli bychom použít název jednotky A pro kvalifikování volání do verze rutiny A z jednotky B.
Zvažte něco takového:
jednotka B;... použití A;... postup Název rutiny; začít Výsledek: = A.RoutineName; konec;
Alternativou k použití přetížených rutin je použití výchozích parametrů, jejichž výsledkem je obvykle méně kódu pro zápis a údržbu.
Výchozí / volitelné parametry
Abychom zjednodušili některé příkazy, můžeme dát výchozí hodnotu parametru funkce nebo procedury a můžeme zavolat rutinu s parametrem nebo bez něj, což je volitelné. Chcete-li poskytnout výchozí hodnotu, ukončete deklaraci parametrů symbolem rovnosti (=) následovaným konstantním výrazem.
Například vzhledem k prohlášení
funkce SumAsStr (a, b: rozšířené; Číslice: celé číslo = 2): tětiva;
Následující volání funkcí jsou ekvivalentní.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Poznámka: Parametry s výchozími hodnotami se musí vyskytnout na konci seznamu parametrů a musí být předány hodnotou nebo jako const. Parametr reference (var) nemůže mít výchozí hodnotu.
Při volání rutin s více než jedním výchozím parametrem nemůžeme přeskočit parametry (jako ve VB):
funkce SkipDefParams (var Řetězec; B: celé číslo = 5, C: boolean = False): boolean;... // toto volání generuje chybovou zprávu
CantBe: = SkipDefParams ('delphi',, True);
Přetížení výchozími parametry
Při použití funkce nebo přetížení procedury a výchozích parametrů nezavádějte nejednoznačné rutinní deklarace.
Zvažte následující prohlášení:
postup DoIt (A: rozšířené; B: celé číslo = 0); přetížení; postup DoIt (A: rozšířeno); přetížení;
Volání doIt procedury jako DoIt (5.0), není kompilovat. Z důvodu výchozího parametru v první proceduře může tento příkaz volat obě procedury, protože není možné určit, která procedura má být volána.