Dans cet article, vous découvrirez la surcharge de fonctions, quand avons-nous besoin d'une surcharge de fonctions et comment surcharger avec des exemples.
Deux fonctions ou plus ayant le même nom mais des arguments différents sont appelées fonctions surchargées.
Pourquoi avons-nous besoin d'une surcharge de fonctions?
Imaginez que vous développez un jeu de tir où le joueur peut attaquer ses ennemis à l'aide d'un couteau, d'une lame et d'un pistolet. Votre solution pour la fonctionnalité d'attaque peut être de définir les actions en fonctions comme:
func attack() ( //… print("Attacking with Knife") ) func attack() ( //… print("Attacking with Blade") ) func attack() ( //… print("Attacking with Gun") )
Mais lorsque vous essayez d'exécuter le programme ci-dessus, vous obtiendrez une erreur de compilation dans Swift comme 'attack ()' précédemment déclaré ici . Cependant, une autre solution pourrait être de définir différents noms de fonction pour la fonctionnalité particulière comme:
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 vous inquiétez pas si vous ne savez pas ce qu'est la structure. Pour l'instant, pensez-y simplement comme quelque chose qui crée un objet physique dans la programmation, vous créez donc un couteau, un pistolet et une lame. Si vous voulez en savoir plus, consultez Swift Struct. Sinon, nous y reviendrons dans les chapitres suivants.
Le seul problème avec cette solution est que vous devez vous souvenir des noms de fonction pour appeler cette action d'attaque particulière. De plus, à mesure que le niveau augmente, le joueur peut avoir des fonctionnalités supplémentaires pour l'attaque à l'aide d'une bombe, d'une grenade, d'un fusil de chasse, etc.
La création d'une fonction avec des noms différents prend du temps et augmente la surcharge liée à la mémorisation du nom de la fonction pour l'appeler. Dans l'ensemble, ce n'est pas intuitif.
Ce serait bien mieux si vous pouviez créer différentes fonctions avec le même nom mais une implémentation différente pour chaque arme. De cette façon, se souvenir d'un nom de fonction suffit et vous n'aurez pas à vous soucier des noms de fonction des autres armes.
Qu'est-ce que la surcharge de fonctions?
Le processus que nous venons de décrire est connu sous le nom de surcharge de fonctions. Par définition, le processus de création de deux fonctions ou plus avec le même nom mais ayant un nombre ou des types de paramètres différents est connu sous le nom de surcharge de fonction.
Voyons cela dans l'exemple ci-dessous:
Exemple 1: surcharge de fonction
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())
Lorsque vous exécutez le programme ci-dessus, la sortie sera:
Attaquer avec une arme à feu Attaquer avec une lame Attaquer avec un couteau
Dans le programme ci-dessus, nous avons créé trois fonctions différentes avec le même nom attack
. Cependant, il accepte différents types de paramètres. De cette façon, il attack
suffit de se souvenir du nom pour appeler la fonction.
- L'appel
attack(with: Gun())
déclenche l'instruction à l'intérieur de la fonctionfunc attack(with weapon:Gun)
. - L'appel
attack(with: Blade())
déclenche l'instruction à l'intérieur de la fonctionfunc attack(with weapon:Blade)
. - L'
attack(with: Knife())
instruction d' appel à l'intérieur de la fonctionfunc attack(with weapon:Knife)
.
Exemple 2: surcharge de fonction basée sur différents types de paramètres
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")
Lorsque vous exécutez le programme ci-dessus, la sortie sera:
La valeur int est 2 La valeur de la chaîne est Swift
Dans le programme ci-dessus, nous avons deux fonctions avec le même nom output()
et le même nombre de paramètres. Cependant, la première output()
fonction prend un entier comme paramètre et la seconde output()
fonction prend String
comme paramètre.
Similaire à l'exemple 1,
- l'appel à
output(x: 2)
déclenche l'instruction à l'intérieur de la fonctionfunc output(x:Int)
et - l'appel à
output(x: "Swift")
déclenche l'instruction à l'intérieur de la fonctionfunc output(x:String)
.
Exemple 3: surcharge de fonction basée sur un nombre différent de paramètres
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)
Lorsque vous exécutez le programme ci-dessus, la sortie sera:
Bonjour! Bonsoir! Bonne nuit!
Dans le programme ci-dessus, la fonction output()
a été surchargée en fonction du nombre d'arguments.
Le premier output()
ne prend aucun paramètre, le second output()
prend un seul paramètre:, String
et le troisième output()
prend deux paramètres: String
et Int
.
Essayons de surcharger en changeant le nom du paramètre mais en gardant l'étiquette d'argument identique à:
Exemple 4: surcharge de fonction avec la même étiquette d'argument
func output(value text:String) ( print(text) ) func output(value num:Int) ( print(num) ) output(value: 2) output(value: "Hello")
Lorsque vous exécutez le programme ci-dessus, la sortie sera:
2 Bonjour
Comme vous pouvez le voir, dans le programme ci-dessus, vous pouvez utiliser la même étiquette d'argument pour les fonctions surchargées. Cependant, comme la surcharge l'exige, vous devez avoir un nombre de paramètres différent ou différents types de paramètres.