Ce document présente les concepts objets de surcharge et de polymorphisme en C#, avec une description, les cas d'utilisation et une implémentation pour chacun d'entre eux.
1. AlgoWin - James RAVAILLE
http://www.algowin.fr
Surcharge
et
Polymorphisme
en C#
Spécialiste de la formation et de l’ingénierie avec la plateforme Microsoft .NET
2. AlgoWin - James RAVAILLE
LA SURCHARGE
S’applique uniquement aux constructeurs et aux méthodes des classes
(que les méthodes soient statiques ou non)
Concept objet permettant de décliner un service de création d’objet ou
un service d’instance ou statique, pour proposer un même traitement
ou un traitement différent mais avec des paramètres d’entrée
différents
Peut être utilisé au sein d’une même classe (constructeurs et
méthodes) ou au sein d’un arbre d’héritage (méthodes seulement)
Une méthode / un constructeur surcharge une autre méthode /
constructeur quand elle / il porte le même nom à condition qu’elle / il
n’ait pas la même liste des types de paramètre dans le même ordre
3. AlgoWin - James RAVAILLE
SURCHARGE DE CONSTRUCTEURS (1)
La classe Voiture propose une surcharge de constructeurs
Il existe donc deux manières de créer une instance de la classe
Voiture : avec et sans couleur
Le second constructeur appelle le premier constructeur en proposant
une couleur par défaut, la couleur blanche
• Cela permet de factoriser le code commun entre les deux constructeurs
• Lors de l’ajout de paramètres au premier constructeur, le compilateur nous
demandera de modifier ou de fournir une valeur par défaut dans le second
constructeur
public class Voiture : Vehicule {
public Voiture(string aNumeroImmatriculation, string aMarque, Color aCouleur)
: base(aNumeroImmatriculation, aMarque, aCouleur) {
}
public Voiture(string aNumeroImmatriculation, string aMarque)
: this(aNumeroImmatriculation, aMarque, Color.White) {
}
}
Les deux constructeurs n’ont
pas les mêmes paramètres
4. AlgoWin - James RAVAILLE
SURCHARGE DE CONSTRUCTEURS (2)
Lors de la création d’une instance de la classe Voiture, les deux
surcharges sont proposées
La voiture est de couleur blanche
La voiture est de couleur noire
Voiture oVoiture = new Voiture("123 ERT 44", "Pigeot");
Voiture oVoiture = new Voiture("123 ERT 44", "Pigeot", Color.Black);
5. AlgoWin - James RAVAILLE
SURCHARGE DE MÉTHODES (1)
Avec ces méthodes, la classe Voiture propose deux manières de
démarrer un objet de type Voiture, avec et sans une vitesse à atteindre
public void Demarrer(byte aVitesse)
{
// Implémentation.
}
public void Demarrer()
{
// Implémentation.
}
Les deux méthodes ont le même nom
mais pas les mêmes paramètres
6. AlgoWin - James RAVAILLE
SURCHARGE DE MÉTHODES (2)
Lors de la création d’une instance de la classe Voiture, les deux
surcharges de la méthode Demarrer sont proposées :
La voiture a démarré
La voiture a démarré pour atteindre la vitesse de 50 km/h
oVoiture.Demarrer();
oVoiture.Demarrer(50);
7. AlgoWin - James RAVAILLE
LA REDÉFINITION (1)
S’applique uniquement aux accesseurs et méthodes d’instance des
classes
Pour comprendre le polymorphisme :
• Poly : plusieurs
• Morphisme : forme
Technique permettant aux accesseurs et méthodes d’avoir plusieurs
formes (implémentations, blocs de code), en fonction de la classe dans
laquelle ces membres de situent
Différentes manières de mettre en œuvre le polymorphisme :
• Le polymorphisme par héritage
• Le polymorphisme par abstraction
• Le polymorphisme par interface
8. AlgoWin - James RAVAILLE
LA REDÉFINITION (2)
Soit l’arbre d’héritage suivant :
Classe de base
Classes dérivées ou
héritées
9. AlgoWin - James RAVAILLE
LE POLYMORPHISME PAR HÉRITAGE (1)
Le polymorphisme par héritage consiste à définir des méthodes /
accesseurs virtuels (avec le mot clé virtual) dans une classe afin d’avoir
la possibilité de les redéfinir dans les classes dérivées (avec le mot clé
override)
Pourquoi redéfinir la méthode ou l’accesseur dans une classe dérivée
(au choix) ?
• Pour compléter le comportement de la méthode dans la classe de base (mode
complétion)
• Pour remplacer le comportement de la méthode dans la classe de base (mode
annule et remplace)
10. AlgoWin - James RAVAILLE
LE POLYMORPHISME PAR HÉRITAGE (2)
Dans le classe Vehicule, ajout d’une méthode nommée Vendre() dont
l’implémentation est la suivante :
Par exemple, dans la classe Voiture, cette méthode est redéfinie :
public virtual string Vendre()
{
this.Etat = EtatsVehicule.Vendu;
return "Le véhicule a été vendu.";
}
Cette méthode peut être redéfinie dans les classes dérivées
public override string Vendre()
{
base.Vendre();
return "La voiture a été vendue.";
}
Appel du comportement de la méthode
Vendre dans la classe de base
11. AlgoWin - James RAVAILLE
LE POLYMORPHISME PAR ABSTRACTION (1)
Le polymorphisme par abstraction consiste à définir des méthodes
abstraites (avec le mot clé abstract) dans une classe, car même si ce
service doit être proposé dans la classe, il est trop haut dans l’arbre
d’héritage pour proposer une implémentation (un bloc de code)
Conséquences :
• L’obligation de définir la classe comme étant abstraite
• L’obligation de redéfinir dans les classes héritées immédiates (avec le mot clé
override). Toutefois, une classe héritée peut être déclarée comme étant aussi
abstraite afin de déléguer de nouveau l’implémentation aux classes qui en
dérivent
• Impossibilité d’instancier la classe devenue abstraite
12. AlgoWin - James RAVAILLE
LE POLYMORPHISME PAR ABSTRACTION (2)
Dans le classe Vehicule, ajout d’une méthode nommée Garer() dont
l’implémentation est la suivante :
La classe devient donc abstraite :
La méthode doit être redéfinie dans la classe Voiture :
La méthode doit être redéfinie dans la classe Camion :
public abstract string Garer();
public abstract class Vehicule {
public override string Garer()
{
return "La voiture est garée avec succès.";
}
public override string Garer()
{
return "Le camion est garé avec succès.";
}
Les méthodes ont les mêmes signatures
13. AlgoWin - James RAVAILLE
TABLEAU RÉCAPITULATIF DES DIFFÉRENCES
Surcharge Redéfinition
Membres concernés Constructeurs et méthodes Accesseurs et méthodes
Signature identique Non Oui
Notion de contrat Non Oui
Peut s’appliquer aux membres statiques Oui Non