I denne artikkelen vil du lære om funksjonsoverbelastning, når trenger vi funksjonsoverbelastning og hvordan overbelastes med eksempler.
To eller flere funksjoner med samme navn, men forskjellige argumenter, er kjent som overbelastede funksjoner.
Hvorfor trenger vi funksjonsoverbelastning?
Tenk deg at du utvikler et skytespill der spilleren kan angripe fiendene sine ved hjelp av en kniv, et blad og en pistol. Løsningen din for angrepsfunksjonaliteten kan være å definere handlingene i funksjoner som:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Men når du prøver å kjøre det ovennevnte programmet, vil du få en kompileringsfeil i Swift som 'angrep ()' tidligere erklært her . Imidlertid kan en annen løsning være å definere forskjellige funksjonsnavn for den spesielle funksjonaliteten som:
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") )
Ikke bekymre deg hvis du ikke vet hva struct er. Foreløpig bare tenk på det som noe som skaper et fysisk objekt i programmeringen, så du lager en kniv, pistol og blad. Hvis du vil vite mer, se Swift Struct. Hvis ikke, kommer vi tilbake til det i de senere kapitlene.
Det eneste problemet med denne løsningen er at du må huske funksjonsnavnene for å kalle den angrepshandlingen. Også når nivået stiger, kan spilleren ha tilleggsfunksjoner for angrep ved hjelp av bombe, granat, hagle osv.
Å lage funksjon med forskjellige navn er tidkrevende og øker overhead for å huske funksjonsnavnet for å kalle det. Alt i alt er det ikke intuitivt.
Det ville være mye bedre hvis du kunne lage forskjellige funksjoner med samme navn, men forskjellig implementering for hvert våpen. På denne måten er det nok å huske ett funksjonsnavn, og du trenger ikke å bekymre deg for funksjonsnavnene til andre våpen.
Hva er funksjonsoverbelastning?
Prosessen vi nettopp beskrev er kjent som funksjonsoverbelastning. Per definisjon er prosessen med å lage to eller flere enn to funksjoner med samme navn, men som har forskjellige antall eller typer parametere overført, kjent som overbelastning av funksjoner.
La oss se dette i eksemplet nedenfor:
Eksempel 1: Funksjon Overbelastning
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())
Når du kjører programmet ovenfor, vil utdataene være:
Attacking with Gun Attacking with Blade Attacking with Knife
I programmet ovenfor har vi laget tre forskjellige funksjoner med samme navn attack
. Imidlertid godtar den forskjellige parametertyper. På denne måten attack
er det nok å huske navn for å ringe funksjonen.
- Samtalen
attack(with: Gun())
utløser uttalelsen inne i funksjonenfunc attack(with weapon:Gun)
. - Samtalen
attack(with: Blade())
utløser uttalelsen inne i funksjonenfunc attack(with weapon:Blade)
. - Samtalen
attack(with: Knife())
uttalelsen inne funksjonenfunc attack(with weapon:Knife)
.
Eksempel 2: Funksjon Overbelastning basert på forskjellige parametertyper
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")
Når du kjører programmet ovenfor, vil utdataene være:
Int-verdien er 2 Strengverdien er Swift
I programmet ovenfor har vi to funksjoner med samme navn output()
og samme antall parametere. Imidlertid output()
tar den første funksjonen et helt tall som parameter, og den andre output()
funksjonen tar String
som en parameter.
I likhet med eksempel 1,
- samtalen for å
output(x: 2)
utløse uttalelsen inne i funksjonenfunc output(x:Int)
og - kallet for å
output(x: "Swift")
utløse utsagnet inne i funksjonenfunc output(x:String)
.
Eksempel 3: Overbelastning av funksjoner basert på forskjellig antall parametere
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)
Når du kjører programmet ovenfor, vil utdataene være:
God morgen! God kveld! God natt!
I programmet ovenfor har funksjonen output()
blitt overbelastet basert på antall argumenter.
Den første output()
tar ingen parametere, den andre output()
tar en enkelt parameter:, String
og den tredje output()
tar to parametere: String
og Int
.
La oss prøve å overbelaste ved å endre parameternavnet, men holde argumentetiketten den samme som:
Eksempel 4: Overbelastning av funksjoner med samme argumentetikett
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Når du kjører programmet ovenfor, vil utdataene være:
2 Hei
Som du kan se, i programmet ovenfor, kan du bruke samme argumentetikett for de overbelastede funksjonene. Som overbelastning krever, må du imidlertid ha et annet antall parametere eller forskjellige typer parametere.