Greita funkcijų perkrova (su pavyzdžiais)

Šiame straipsnyje sužinosite apie funkcijų perkrovimą, kada mums reikia funkcijų perkėlimo ir kaip perkrauti pavyzdžius.

Dvi ar daugiau funkcijų, turinčių tą patį pavadinimą, bet skirtingus argumentus, yra vadinamos perkrautomis funkcijomis.

Kodėl mums reikia funkcijų perkrovos?

Įsivaizduokite, kad kuriate šaulių žaidimą, kuriame žaidėjas gali užpulti savo priešus naudodamas peilį, ašmenis ir ginklą. Atakos funkcionalumo sprendimas gali apibrėžti veiksmus į funkcijas:

 func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") ) 

Bet kai bandysite paleisti pirmiau nurodytą programą, gausite kompiliavimo laiko klaidą „Swift“ kaip čia anksčiau deklaruotą „ataką ()“ . Tačiau kitas sprendimas gali būti skirtingų funkcijų pavadinimų apibrėžimas konkrečiai funkcijai:

 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") ) 

Nesijaudinkite, jei nežinote, kas yra struktūra. Dabar galvokite apie tai kaip apie tai, kas sukuria fizinį objektą programuojant, taigi jūs kuriate peilį, ginklą ir ašmenis. Jei norite sužinoti daugiau, žr. „Swift Struct“. Jei ne, grįšime prie jo vėlesniuose skyriuose.

Vienintelė šio sprendimo problema yra tai, kad turite atsiminti funkcijų pavadinimus, kad iškviestumėte tą konkretų atakos veiksmą. Be to, kylant lygiui, žaidėjas gali turėti papildomų atakos funkcijų naudojant bombą, granatą, šautuvą ir kt.

Kuriant funkciją su skirtingais pavadinimais, užima daug laiko ir padidėja prisimenant funkcijos pavadinimą, kad ją būtų galima pavadinti. Apskritai tai nėra intuityvu.

Būtų daug geriau, jei galėtumėte sukurti skirtingas funkcijas tuo pačiu pavadinimu, bet skirtingai įgyvendinti kiekvieną ginklą. Tokiu būdu pakanka prisiminti vieną funkcijos pavadinimą ir jums nereikės jaudintis dėl kitų ginklų funkcijų pavadinimų.

Kas yra funkcijos perkrova?

Ką tik aprašytas procesas vadinamas funkcijų perkrova. Pagal apibrėžimą, dviejų ar daugiau funkcijų, turinčių tą patį pavadinimą, bet turinčių skirtingą skaičių ar tipų parametrų, sukūrimo procesas vadinamas funkcijų perkrova.

Pažiūrėkime tai žemiau pateiktame pavyzdyje:

1 pavyzdys: funkcijos perkrova

 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()) 

Kai paleisite pirmiau nurodytą programą, išvestis bus:

 Puolimas ginklu Puolimas peiliu 

Pirmiau pateiktoje programoje mes sukūrėme tris skirtingas funkcijas tuo pačiu pavadinimu attack. Tačiau jis priima skirtingus parametrų tipus. Tokiu būdu attackpakanka prisiminti vardą, kad iškviestumėte funkciją.

  • Skambinimas attack(with: Gun())suaktyvina sakinį funkcijos viduje func attack(with weapon:Gun).
  • Skambinimas attack(with: Blade())suaktyvina sakinį funkcijos viduje func attack(with weapon:Blade).
  • Skambučio attack(with: Knife())sakinys funkcijos viduje func attack(with weapon:Knife).

2 pavyzdys: Funkcijos perkrova pagal skirtingus parametrų tipus

 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") 

Kai paleisite pirmiau nurodytą programą, išvestis bus:

 Int vertė yra 2 Stygos vertė yra „Swift“ 

Pirmiau pateiktoje programoje mes turime dvi funkcijas su tuo pačiu pavadinimu output()ir tuo pačiu parametrų skaičiumi. Tačiau, pirmasis output()funkcija priima sveiką skaičių kaip parametras, o antrasis output()funkcija priima Stringkaip parametras.

Panašus į 1 pavyzdį,

  • raginimas output(x: 2)suaktyvinti sakinį funkcijos viduje func output(x:Int)ir
  • raginimas output(x: "Swift")suaktyvinti sakinį funkcijos viduje func output(x:String).

3 pavyzdys: funkcijos perkrova pagal skirtingą parametrų skaičių

 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) 

Kai paleisite pirmiau nurodytą programą, išvestis bus:

Labas rytas! Labas vakaras! Labos nakties!

Ankstesnėje programoje funkcija output()buvo perkrauta, atsižvelgiant į argumentų skaičių.

Pirmasis output()nepriima jokių parametrų, antrasis output()paima vieną parametrą:, Stringo trečiasis - output()du parametrus: Stringir Int.

Pabandysime perkrauti keisdami parametro pavadinimą, bet argumento etiketę išlaikydami tokią pat kaip:

4 pavyzdys: Funkcijos perkrova su ta pačia argumento etikete

 func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello") 

Kai paleisite pirmiau nurodytą programą, išvestis bus:

 2 Sveiki

Kaip matote, aukščiau pateiktoje programoje galite naudoti tą pačią argumentų etiketę perkrautoms funkcijoms. Tačiau, kaip reikalauja perkrova, turite turėti skirtingą parametrų skaičių arba skirtingų tipų parametrus.

Įdomios straipsniai...