Přetěžování procedur a funkcí – možnost používat stejnojmenné podprogramy: procedury nebo funkce v programovacích jazycích.
Ve většině raných programovacích jazyků, pro zjednodušení procesu překladu, existovalo omezení, že v programu nemohlo být současně k dispozici více než jedna procedura se stejným názvem. Podle tohoto omezení musí mít všechny podprogramy viditelné v daném bodě programu různé názvy.
Názvy a označení procedur a funkcí, které jsou součástí programovacího jazyka, nemůže programátor použít k pojmenování vlastních podprogramů.
Aby bylo možné použít několik variant podprogramu se stejným názvem, ale s jiným počtem argumentů nebo jinými typy argumentů (tj. s jiným podpisem , protože seznam argumentů je součástí podpisu), podprogram je zavedeno přetěžování. Takové přetížení je možné v rámci procedurálního paradigmatu , bez použití objektově orientovaného programování.
Při překladu jsou stejnojmenné procedury a funkce řízeny tak, že se liší podpisem, protože v tomto případě může překladatel jednoznačně určit volání požadovaného podprogramu.
Aby se vyloučila chyba programátora, který omylem pojmenoval podprogram, který se již používá, je zaveden další požadavek na zapsání klíčového slova. To se provádí například v jazyce Delphi (klíčové slovo přetížení).
Přetížené funkce mají stejný název, ale různé počty nebo typy argumentů. Jedná se o druh statického polymorfismu , ve kterém o otázce, kterou funkci zavolat, rozhoduje seznam jejích argumentů. Tento přístup se používá ve staticky typovaných jazycích, které při volání funkce kontrolují typy argumentů. Přetížená funkce je ve skutečnosti několik různých funkcí a výběr vhodné z nich nastává v době kompilace. Přetížení funkcí by se nemělo zaměňovat s formami polymorfismu, kde je správná metoda zvolena za běhu, například prostřednictvím virtuálních funkcí, spíše než staticky.
Příklad: Přetížení funkcí v C++
hlavní () { cout << objem ( 10 ); cout << hlasitost ( 2,5 , 8 ); cout << objem ( 100 , 75 , 15 ); } // objem krychle int objem ( int s ) { return ( s * s * s ); } // objem válce dvojnásobný objem ( double r , int h ) { návrat ( 3,14 * r * r * h ); } // objem kvádru dlouhý objem ( long l , int b , int h ) { návrat ( l * b * h ); }Ve výše uvedeném příkladu je objem různých komponent vypočítán pomocí volání různých "objemových" funkcí s argumenty lišícími se datovým typem nebo množstvím.
Příklad: přetížení funkcí v jazyce Nim.
přetížení proc ( x : int ) = echo "string int" přetížení proc ( x : float ) = echo "provázkový plovák" přetížení ( 1 ) # vytiskne "string int" přetížení ( 1.1 ) # vypíše "string float"Konstruktory používané k vytváření instancí objektů mohou být také přetížené v některých objektově orientovaných programovacích jazycích. Protože v mnoha jazycích je název konstruktoru předdefinován názvem třídy, zdálo by se, že může existovat pouze jeden konstruktor. Kdykoli je vyžadováno více konstruktorů, jsou implementovány jako přetížené funkce. Výchozí konstruktor nemá žádné parametry, instance objektu přebírá nulové členy. [ 1 ] Například výchozí konstruktor pro objekt bill v restauraci napsaný v C++ může nastavit Tip na 15 %:
účet () { tip = 15,0 ; celkem = 0,0 ; }Nevýhodou je, že ke změně hodnoty vytvořeného objektu Bill jsou potřeba dva kroky. Následující obrázek ukazuje vytváření a úpravy hodnot v rámci hlavního programu:
Bill kavárna ; kavárna . tip = 10,00 ; kavárna . celkem = 4,00 ;Přes přetížení konstruktoru by bylo možné předat tip a obecnou kvalitu parametrů při vytváření. Příklad ukazuje přetížený konstruktor se dvěma parametry:
Bill ( double setTip , double setTotal ) { tip = set Tip ; celkem = setTotal ; }Nyní může funkce, která vytvoří nový objekt Bill, předat dvě hodnoty konstruktoru a nastavit datové členy v jednom kroku. Následující text ukazuje, jak vytvořit a nastavit hodnoty:
Bill cafe ( 10.00 , 4.00 );To může být užitečné pro zefektivnění programů a zmenšení velikosti kódu.
Vícenásobné přetížení procedury nebo funkce může vývojářům ztížit zjištění, které přetížení se v kterou chvíli používá.
Možnost přetížení názvů procedur a funkcí v programu je dána schopnostmi parsování kompilátoru a požadavky standardu jazyka pro jejich zápis. Syntaktická analýza spočívá ve spárování volání přetížené funkce s konkrétní funkcí (se specifickým podpisem) a neovlivňuje spotřebu zdrojů programu a dobu jeho provádění.
Velikost zkompilovaného programového kódu se při použití přetížení funkcí místo funkce s libovolným počtem argumentů zvětší (místo jedné procedury s proměnným počtem argumentů se jich zkompiluje několik pro konkrétní počet), ale výkon programu se zvyšuje při volání procedury, která je popsána jako přetížená (neprovádí se typová analýza a další výpočetní operace během provádění programu). Takže například v knihovně C++ STL jsou často používané funkce s proměnným počtem argumentů nahrazeny přetížením.