Ebben a cikkben megismerheti a függvények túlterhelését, mikor kell a függvények túlterhelése és hogyan lehet példákkal túlterhelni.
Két vagy több azonos nevű, de eltérő argumentumú függvényt túlterhelt függvénynek nevezünk.
Miért van szükség a funkció túlterhelésére?
Képzelje el, hogy lövöldözős játékot fejleszt, ahol a játékos késsel, pengével és fegyverrel támadhatja meg ellenségeit. A támadási funkció megoldása lehet, hogy a műveleteket funkciókként határozza meg:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
De amikor megpróbálja futtatni a fenti programot, fordítási időhibát kap a Swift-ben, mint korábban itt deklarált 'támadás ()' . Lehet azonban egy másik megoldás, ha az adott funkcióhoz különböző függvényneveket határozunk meg:
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") )
Ne aggódjon, ha nem tudja, mi a struktúra. Most csak úgy gondoljon rá, mint valamire, amely fizikai objektumot hoz létre a programozás során, tehát egy kést, fegyvert és pengét hoz létre. Ha többet szeretne megtudni, olvassa el a Swift Structúrát. Ha nem, akkor visszatérünk rá a későbbi fejezetekben.
Az egyetlen probléma ezzel a megoldással az, hogy emlékeznie kell a függvénynevekre az adott támadási művelet meghívásához. A szint emelkedésével a játékosnak további tulajdonságai is lehetnek a bombával, gránáttal, puskával stb. Történő támadáshoz.
Különböző nevű függvény létrehozása időigényes, és megnöveli a funkció nevének meghívásakor történő emlékezés költségeit. Összességében ez nem intuitív.
Sokkal jobb lenne, ha különböző funkciókat hozhatna létre ugyanazzal a névvel, de az egyes fegyverekhez eltérő megvalósítást. Ily módon elegendő megjegyezni egy függvénynevet, és nem kell aggódnia más fegyverek függvénynevei miatt.
Mi a függvény túlterhelése?
Az imént leírt folyamatot függvény-túlterhelésnek nevezzük. Definíció szerint két vagy több, azonos névvel rendelkező, de eltérő számú vagy típusú paramétert átadó függvény létrehozásának folyamata funkciótúlterhelésnek nevezhető.
Lássuk ezt az alábbi példában:
1. példa: Funkció túlterhelés
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())
A fenti program futtatásakor a kimenet a következő lesz:
Támadás fegyverrel Támadás pengével késsel
A fenti programban három különböző funkciót hoztunk létre ugyanazzal a névvel attack
. Ugyanakkor különböző paramétertípusokat fogad el. Így attack
elegendő megjegyezni a nevet a függvény meghívásához.
- A hívás
attack(with: Gun())
elindítja a függvényen belüli utasítástfunc attack(with weapon:Gun)
. - A hívás
attack(with: Blade())
elindítja a függvényen belüli utasítástfunc attack(with weapon:Blade)
. - A
attack(with: Knife())
függvényen belüli hívás utasításfunc attack(with weapon:Knife)
.
2. példa: Funkció Túlterhelés különböző paramétertípusok alapján
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")
A fenti program futtatásakor a kimenet a következő lesz:
Az int értéke 2 A karakterlánc értéke Swift
A fenti programban két függvényünk van, azonos névvel output()
és azonos számú paraméterrel. Az első output()
függvény azonban egész számot vesz paraméterként, a második output()
függvény String
paramétert vesz fel.
Az 1. példához hasonlóan
- a
output(x: 2)
függvényen belüli utasítást kiváltó hívásfunc output(x:Int)
és - a
output(x: "Swift")
függvényen belüli utasítás elindításafunc output(x:String)
.
3. példa: Funkció Túlterhelés különböző számú paraméter alapján
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)
A fenti program futtatásakor a kimenet a következő lesz:
Jó reggelt kívánok! Jó estét! Jó éjszakát!
A fenti programban a függvény output()
túlterhelt az argumentumok száma alapján.
Az első output()
nem veszi be a paramétereket, a második output()
egyetlen paramétert vesz fel:, String
a harmadik output()
pedig két paramétert vesz fel: String
és Int
.
Megpróbáljuk túlterhelni a paraméter nevének megváltoztatásával, de az argumentum címkéjét megtartva:
4. példa: Funkció túlterhelése ugyanazzal az argumentumcímkével
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
A fenti program futtatásakor a kimenet a következő lesz:
2 Hello
Mint látható, a fenti programban ugyanazt az argumentumcímkét használhatja a túlterhelt függvényekhez. Mivel azonban a túlterhelés megköveteli, vagy különböző számú paraméterrel, vagy más típusú paraméterekkel kell rendelkeznie.