V tomto článku se dozvíte o přetížení funkcí, kdy potřebujeme přetížení funkcí a jak přetížit příklady.
Dvě nebo více funkcí, které mají stejný název, ale různé argumenty, jsou známé jako přetížené funkce.
Proč potřebujeme přetížení funkcí?
Představte si, že vyvíjíte střílečku, ve které hráč může zaútočit na své nepřátele nožem, čepelí a zbraní. Vaše řešení pro funkčnost útoku může být definování akcí do funkcí jako:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Ale když se pokusíte spustit výše uvedený program, zobrazí se chyba kompilace v Swiftu, protože zde byl dříve deklarován 'útok ()' . Dalším řešením však může být definování různých názvů funkcí pro konkrétní funkce jako:
struct Knife ( ) struct Gun ( ) struct Blade ( ) func attackUsingKnife(weapon:Knife) ( //… print("Attacking with Knife") ) func attackUsingBlade(weapon:Blade) ( //… print("Attacking with Blade") ) func attackUsingGun(weapon:Gun) ( //… print("Attacking with Gun") )
Nebojte se, pokud nevíte, co je struktura. Prozatím si to představte jako něco, co vytváří fyzický objekt v programování, takže vytváříte nůž, zbraň a čepel. Pokud se chcete dozvědět více, podívejte se na Swift Struct. Pokud ne, vrátíme se k tomu v dalších kapitolách.
Jediným problémem tohoto řešení je, že si musíte pamatovat názvy funkcí, které volají konkrétní akci útoku. Se zvyšováním úrovně může mít hráč další funkce pro útok pomocí bomby, granátu, brokovnice atd.
Vytvoření funkce s různými názvy je časově náročné a zvyšuje režii při zapamatování názvu funkce, která se má volat. Celkově to není intuitivní.
Bylo by mnohem lepší, kdybyste pro každou zbraň mohli vytvořit různé funkce se stejným názvem, ale s odlišnou implementací. Takto si stačí zapamatovat jeden název funkce a nebudete se muset starat o názvy funkcí pro jiné zbraně.
Co je přetížení funkce?
Proces, který jsme právě popsali, je známý jako přetížení funkce. Podle definice je proces vytváření dvou nebo více než dvou funkcí se stejným názvem, ale s odlišným počtem nebo typy předaných parametrů znám jako přetížení funkce.
Podívejme se na to v následujícím příkladu:
Příklad 1: Přetížení funkce
struct Knife ( ) struct Gun ( ) struct Blade ( ) func attack(with weapon:Knife) ( print("Attacking with Knife") ) func attack(with weapon:Gun) ( print("Attacking with Gun") ) func attack(with weapon:Blade) ( print("Attacking with Blade") ) attack(with: Gun()) attack(with: Blade()) attack(with: Knife())
Když spustíte výše uvedený program, výstup bude:
Útoky na zbraně Útoky na čepele Útoky nožem
Ve výše uvedeném programu jsme vytvořili tři různé funkce se stejným názvem attack
. Přijímá však různé typy parametrů. Takto si attack
stačí zapamatovat jméno pro volání funkce.
- Volání
attack(with: Gun())
spustí příkaz uvnitř funkcefunc attack(with weapon:Gun)
. - Volání
attack(with: Blade())
spustí příkaz uvnitř funkcefunc attack(with weapon:Blade)
. - Příkaz volání
attack(with: Knife())
uvnitř funkcefunc attack(with weapon:Knife)
.
Příklad 2: Přetížení funkce na základě různých typů parametrů
func output(x:Int) ( print("The int value is (x)") ) func output(x:String) ( print("The string value is (x)") ) output(x: 2) output(x: "Swift")
Když spustíte výše uvedený program, výstup bude:
Hodnota int je 2 Hodnota řetězce je Swift
Ve výše uvedeném programu máme dvě funkce se stejným názvem output()
a stejným počtem parametrů. První output()
funkce však bere celé číslo jako parametr a druhá output()
funkce bere String
jako parametr.
Podobně jako v příkladu 1,
- volání
output(x: 2)
spouští příkaz uvnitř funkcefunc output(x:Int)
a - volání
output(x: "Swift")
spouští příkaz uvnitř funkcefunc output(x:String)
.
Příklad 3: Přetížení funkce na základě různého počtu parametrů
func output() ( print("Good Morning!") ) func output(text:String) ( print(text) ) func output(text:String, num:Int) ( print("(text)(num)!") ) output() output(text: "Good Evening!") output(text1: "Good N", num: 8)
Když spustíte výše uvedený program, výstup bude:
Dobré ráno! Dobrý večer! Dobrou noc!
Ve výše uvedeném programu byla funkce output()
přetížena na základě počtu argumentů.
První output()
nebere žádné parametry, druhý output()
bere jeden parametr: String
a třetí output()
bere dva parametry: String
a Int
.
Pokusme se přetížit změnou názvu parametru, ale zachováním označení argumentu jako:
Příklad 4: Přetížení funkce se stejným popisem argumentu
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Když spustíte výše uvedený program, výstup bude:
2 Dobrý den
Jak vidíte, ve výše uvedeném programu můžete použít stejný štítek argumentu pro přetížené funkce. Jak však přetížení vyžaduje, musíte mít buď jiný počet parametrů, nebo různé typy parametrů.