V tem članku boste izvedeli več o preobremenitvi funkcij, kdaj potrebujemo preobremenitev funkcij in kako preobremeniti s primeri.
Dve ali več funkcij z istim imenom, vendar različnimi argumenti, so znane kot preobremenjene funkcije.
Zakaj potrebujemo preobremenitev funkcij?
Predstavljajte si, da razvijate strelsko igro, kjer lahko igralec napada svoje sovražnike z nožem, rezilom in pištolo. Vaša rešitev za funkcionalnost napada je morda definiranje dejanj v funkcije kot:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Ko pa poskusite zagnati zgornji program, boste v Swiftu prejeli napako časa prevajanja kot prej opisano 'napad ()' . Druga rešitev pa je lahko definiranje različnih imen funkcij za določeno funkcionalnost kot:
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 skrbite, če ne veste, kaj je struktura. Za zdaj samo mislite na to kot na nekaj, kar ustvarja fizični objekt pri programiranju, torej ustvarjate nož, pištolo in rezilo. Če želite izvedeti več, glejte Swift Struct. Če ne, se bomo na to vrnili v naslednjih poglavjih.
Edina težava te rešitve je, da si morate zapomniti imena funkcij, da pokličete določeno napadalno akcijo. Ko se nivo dvigne, ima lahko igralec dodatne funkcije za napad z bombo, granato, puško itd.
Ustvarjanje funkcije z različnimi imeni je zamudno in poveča zapomnitev imena funkcije, da jo pokličete. Vse skupaj ni intuitivno.
Veliko bolje bi bilo, če bi lahko ustvarili različne funkcije z istim imenom, vendar različno izvedbo za vsako orožje. Na ta način je dovolj zapomniti eno ime funkcije in vam ne bi bilo treba skrbeti za imena funkcij za drugo orožje.
Kaj je preobremenitev funkcije?
Proces, ki smo ga pravkar opisali, je znan kot preobremenitev funkcije. Po definiciji je postopek ustvarjanja dveh ali več kot dveh funkcij z istim imenom, vendar z različnim številom ali vrstami posredovanih parametrov, znan kot preobremenitev funkcije.
Poglejmo to v spodnjem primeru:
Primer 1: Preobremenitev funkcije
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())
Ko zaženete zgornji program, bo rezultat:
Napad z pištolo Napad z rezilom Napad z nožem
V zgornjem programu smo ustvarili tri različne funkcije z istim imenom attack
. Sprejema pa različne tipe parametrov. Na ta način attack
je dovolj zapomniti ime za klic funkcije.
- Klic
attack(with: Gun())
sproži stavek znotraj funkcijefunc attack(with weapon:Gun)
. - Klic
attack(with: Blade())
sproži stavek znotraj funkcijefunc attack(with weapon:Blade)
. attack(with: Knife())
Stavek klica znotraj funkcijefunc attack(with weapon:Knife)
.
Primer 2: Preobremenitev funkcije na podlagi različnih vrst parametrov
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")
Ko zaženete zgornji program, bo rezultat:
Vrednost int je 2 Vrednost niza je Swift
V zgornjem programu imamo dve funkciji z istim imenom output()
in enakim številom parametrov. Vendar pa prva output()
funkcija za parameter vzame celo število, druga output()
pa String
kot parameter.
Podobno kot v primeru 1,
- klic na
output(x: 2)
sproži stavek znotraj funkcijefunc output(x:Int)
in - klic na
output(x: "Swift")
sproži stavek znotraj funkcijefunc output(x:String)
.
Primer 3: Preobremenitev funkcije na podlagi različnega števila parametrov
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)
Ko zaženete zgornji program, bo rezultat:
Dobro jutro! Dober večer! Lahko noč!
V zgornjem programu je bila funkcija output()
preobremenjena glede na število argumentov.
Prva output()
ne zajema nobenih parametrov, druga output()
zajema en parameter:, String
tretja output()
pa dva parametra: String
in Int
.
Poskusimo preobremeniti tako, da spremenimo ime parametra, vendar ohranimo oznako argumenta enako kot:
Primer 4: Preobremenitev funkcije z isto oznako argumenta
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Ko zaženete zgornji program, bo rezultat:
2 Pozdravljeni
Kot lahko vidite, lahko v zgornjem programu uporabite isto oznako argumenta za preobremenjene funkcije. Vendar, kot zahteva preobremenitev, morate imeti različno število parametrov ali različne vrste parametrov.