In dit artikel leer je over functie-overbelasting, wanneer hebben we functie-overbelasting nodig en hoe je deze kunt overladen met voorbeelden.
Twee of meer functies met dezelfde naam, maar met verschillende argumenten, worden overbelaste functies genoemd.
Waarom hebben we functie-overbelasting nodig?
Stel je voor dat je een schietspel ontwikkelt waarbij de speler zijn vijanden kan aanvallen met een mes, een mes en een geweer. Uw oplossing voor de aanvalsfunctionaliteit is wellicht het definiëren van de acties in functies als:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Maar wanneer u het bovenstaande programma probeert uit te voeren, krijgt u een compilatietijdfout in Swift als 'attack ()' eerder hier gedeclareerd . Een andere oplossing is echter het definiëren van verschillende functienamen voor de specifieke functionaliteit, zoals:
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") )
Maak je geen zorgen als je niet weet wat struct is. Zie het voorlopig als iets dat een fysiek object creëert tijdens het programmeren, dus je maakt een mes, pistool en mes. Zie Swift Struct als je meer wilt weten. Zo niet, dan komen we er in de latere hoofdstukken op terug.
Het enige probleem met deze oplossing is dat u de functienamen moet onthouden om die specifieke aanvalsactie aan te roepen. Ook als het niveau stijgt, kan de speler extra functies hebben om aan te vallen met een bom, granaat, jachtgeweer, enz.
Het maken van een functie met verschillende namen is tijdrovend en verhoogt de overhead voor het onthouden van de functienaam om deze aan te roepen. Al met al is het niet intuïtief.
Het zou veel beter zijn als je verschillende functies zou kunnen creëren met dezelfde naam maar met een verschillende implementatie voor elk wapen. Op deze manier is het onthouden van één functienaam voldoende en hoef je je geen zorgen te maken over de functienamen voor andere wapens.
Wat is functie-overbelasting?
Het proces dat we zojuist hebben beschreven, staat bekend als functie-overbelasting. Per definitie wordt het proces van het creëren van twee of meer dan twee functies met dezelfde naam maar met een verschillend aantal of verschillende soorten parameters, bekend als functie-overbelasting.
Laten we dit in het onderstaande voorbeeld bekijken:
Voorbeeld 1: functie overbelasting
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())
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
Aanvallen met geweer Aanvallen met mes Aanvallen met mes
In het bovenstaande programma hebben we drie verschillende functies gemaakt met dezelfde naam attack
. Het accepteert echter verschillende parametertypes. Op deze manier attack
is het voldoende om de naam te onthouden om de functie aan te roepen.
- De aanroep
attack(with: Gun())
activeert de instructie binnen de functiefunc attack(with weapon:Gun)
. - De aanroep
attack(with: Blade())
activeert de instructie binnen de functiefunc attack(with weapon:Blade)
. - De call-
attack(with: Knife())
instructie binnen de functiefunc attack(with weapon:Knife)
.
Voorbeeld 2: functieoverbelasting op basis van verschillende parametertypes
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")
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
De int-waarde is 2 De tekenreekswaarde is Swift
In het bovenstaande programma hebben we twee functies met dezelfde naam output()
en hetzelfde aantal parameters. De eerste output()
functie heeft echter een geheel getal als parameter en de tweede output()
functie String
als parameter.
Net als in Voorbeeld 1,
- de aanroep naar
output(x: 2)
activeert de instructie binnen de functiefunc output(x:Int)
en - de aanroep om
output(x: "Swift")
de instructie binnen de functie te activerenfunc output(x:String)
.
Voorbeeld 3: Functieoverbelasting op basis van een verschillend aantal parameters
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)
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
Goedemorgen! Goedenavond! Welterusten!
In het bovenstaande programma is de functie output()
overbelast op basis van het aantal argumenten.
De eerste output()
heeft geen parameters, de tweede output()
heeft een enkele parameter:, String
en de derde output()
heeft twee parameters: String
en Int
.
Laten we proberen te overbelasten door de parameternaam te wijzigen maar het argumentlabel hetzelfde te houden als:
Voorbeeld 4: functie-overbelasting met hetzelfde argumentlabel
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Wanneer u het bovenstaande programma uitvoert, is de uitvoer:
2 Hallo
Zoals je kunt zien, kun je in het bovenstaande programma hetzelfde argumentlabel gebruiken voor de overbelaste functies. Omdat overbelasting echter vereist, moet u een verschillend aantal parameters of verschillende soorten parameters hebben.