Tässä artikkelissa opit funktioiden ylikuormituksesta, milloin tarvitsemme toimintojen ylikuormitusta ja kuinka ylikuormittaa esimerkkejä.
Kaksi tai useampia toimintoja, joilla on sama nimi, mutta erilaiset argumentit, kutsutaan ylikuormitetuiksi funktioiksi.
Miksi tarvitsemme toimintojen ylikuormitusta?
Kuvittele, että kehität ampujapeliä, jossa pelaaja voi hyökätä vihollisia vastaan veitsellä, terällä ja aseella. Hyökkäystoimintasi ratkaisu saattaa määritellä toiminnot toiminnoiksi seuraavasti:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Mutta kun yrität suorittaa yllä olevaa ohjelmaa, saat käännösaikavirheen Swiftissä aiemmin hyökkäyksenä () . Toinen ratkaisu voi kuitenkin määritellä eri funktioiden nimet tietylle toiminnolle seuraavasti:
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") )
Älä huoli, jos et tiedä mikä rakenne on. Ajattele sitä nyt vain sellaisena, joka luo fyysisen objektin ohjelmoinnissa, joten luot veitsen, aseen ja terän. Jos haluat tietää enemmän, katso Swift Struct. Jos ei, palaamme siihen myöhemmissä luvuissa.
Ainoa ongelma tässä ratkaisussa on, että sinun on muistettava toimintojen nimet soittaaksesi kyseiselle hyökkäystoiminnolle. Myös tason noustessa pelaajalla voi olla lisäominaisuuksia hyökkäykseen käyttäen pommia, kranaattia, haulikkoa jne.
Funktion luominen eri nimillä on aikaa vievää ja lisää yleiskustannuksia muistamalla funktion nimen kutsumiseksi. Kaiken kaikkiaan se ei ole intuitiivinen.
Olisi paljon parempi, jos voisit luoda erilaisia toimintoja samalla nimellä, mutta eri toteutus kullekin aseelle. Tällä tavoin yhden funktion nimen muistaminen riittää eikä sinun tarvitse huolehtia muiden aseiden funktioiden nimistä.
Mikä on toimintojen ylikuormitus?
Juuri kuvaamamme prosessi tunnetaan toimintojen ylikuormituksena. Määritelmän mukaan kahden tai useamman kuin kahden toiminnon, joilla on sama nimi, mutta joilla on erilainen lukumäärä tai tyyppisiä parametreja, luomisen prosessi tunnetaan toimintojen ylikuormituksena.
Katsotaanpa tämä alla olevassa esimerkissä:
Esimerkki 1: Toiminnon ylikuormitus
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())
Kun suoritat yllä olevan ohjelman, tulos on:
Hyökkäys pistoolilla Hyökkäys terän hyökkäyksellä veitsellä
Edellä olevassa ohjelmassa olemme luoneet kolme erilaista toimintoa samalla nimellä attack
. Se hyväksyy kuitenkin erilaisia parametrityyppejä. Tällä tavalla attack
riittää muistamaan nimi toiminnon kutsumiseksi.
- Kutsu
attack(with: Gun())
laukaisee lausekkeen funktion sisälläfunc attack(with weapon:Gun)
. - Kutsu
attack(with: Blade())
laukaisee lausekkeen funktion sisälläfunc attack(with weapon:Blade)
. attack(with: Knife())
Funktion sisällä oleva puhelulausekefunc attack(with weapon:Knife)
.
Esimerkki 2: Toiminnon ylikuormitus eri parametrityyppien perusteella
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")
Kun suoritat yllä olevan ohjelman, tulos on:
Int-arvo on 2 merkkijonoarvo on Swift
Yllä olevassa ohjelmassa meillä on kaksi toimintoa, joilla on sama nimi output()
ja sama määrä parametreja. Ensimmäinen output()
funktio ottaa kuitenkin kokonaisluvun parametriksi ja toisen output()
funktion String
parametriksi.
Samanlainen kuin esimerkki 1,
- kutsu
output(x: 2)
käynnistää lauseen funktion sisälläfunc output(x:Int)
ja - kutsu
output(x: "Swift")
käynnistää lauseen funktion sisälläfunc output(x:String)
.
Esimerkki 3: Toiminnon ylikuormitus eri parametrimäärän perusteella
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)
Kun suoritat yllä olevan ohjelman, tulos on:
Hyvää huomenta! Hyvää iltaa! Hyvää yötä!
Yllä olevassa ohjelmassa funktio output()
on ylikuormitettu argumenttien määrän perusteella.
Ensimmäinen output()
ei ota parametreja, toinen output()
ottaa yhden parametrin:, String
ja kolmas output()
ottaa kaksi parametria: String
ja Int
.
Yritetään ylikuormittaa muuttamalla parametrin nimeä, mutta pitäen argumenttitarra sama kuin:
Esimerkki 4: Funktion ylikuormitus samalla argumenttitarralla
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Kun suoritat yllä olevan ohjelman, tulos on:
2 Hei
Kuten näette, voit käyttää yllä olevassa ohjelmassa samaa argumenttimerkkiä ylikuormitetuille toiminnoille. Kuten ylikuormitus vaatii, sinulla on kuitenkin oltava joko erilainen määrä parametreja tai erityyppisiä parametreja.