Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C# - Surcharge et polymorphisme

58 views

Published on

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.

Published in: Education
  • Be the first to comment

C# - Surcharge et polymorphisme

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×