Abstraction - Programmation Orientée Objet PDF

Summary

These lecture notes cover the topic of object-oriented programming concepts. It discusses abstraction, inheritance, and virtual methods. The notes include code examples and diagrams related to these concepts.

Full Transcript

2024-11-01 Abstraction 8PRO128 Programmation orientée objet 1 Abstraction Problématiques Héritage multiple Héritage virtuel Méthode virtuelle pure Abstraction UML 2...

2024-11-01 Abstraction 8PRO128 Programmation orientée objet 1 Abstraction Problématiques Héritage multiple Héritage virtuel Méthode virtuelle pure Abstraction UML 2 1 2024-11-01 Problématique générale L’héritage permet de créer des arbres de spécialisation Pinky est un fantôme spécialisé Tous les fantômes ont des « membres » en commun Questionnement? Y-a-t’il un mouvement par « défaut » Avec l’héritage… d’un fantôme? fantomes = new Pinky(); fantomes = new Blinky(); D’une pièce? fantomes = new Inky(); D’un robot? fantomes = new Clyde(); Est-ce que les fantômes existent? fantomes = new Fantome(); //??? for (int f = 0; f < 5; f++) Problématique fantomes[f]->operation(); 3 3 Est-ce possible? Piece* echiquier; for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) echiquier[i][j] = nullptr; If (echiquier == nullptr) echiquer = new Pion(NOIR); { echiquier = echiquer; echiquier = nullptr; } else { delete echiquier; echiquier = echiquer; echiquier = nullptr; echiquer = new Reine(BLANC); } Problématique 4 4 2 2024-11-01 Problématique niveau 2 : Forme Quel est l’aire d’une forme? 0? Exception? -1? Problématique Comment empêcher le programmeur de créer une Forme mais en lui permettant d’en hériter Comment définir la méthode « calculerAire » dans Forme pour créer un tableau de Forme mais forcer les enfants à le redéfinir // NON aireTotale = ((Cylindre)formes[CYLINDRE]).calculerAire() + ((Cone)formes[CONE]).calculerAire(); // OUI Problématique aireTotale = formes[CYLINDRE].calculerAire() + formes[CONE].calculerAire(); 5 5 Problématique niveau 3 : Les règles Supposons un système de gestion de règles (classe qui applique une opération sur une facture par exemple) On ne connait pas les règles car elles sont chargées et liées dynamiquement Chaque règle possède son propre comportement Chaque règle peut être héritée x fois Réflexion Une règle n’existe pas Une règle de modification n’existe pas Une donnée existe (???) mais appartient-elle à la règle qui n’existe pas? Problématique 6 6 3 2024-11-01 Héritage multiple En C++ (et en Python), une classe peut hériter de plusieurs parents Par exemple, la Terre est une planète mais aussi une maison Ce concept est (pratiquement…) inexistant en Java et en C# Syntaxe class : public , public Exemple class Terre : public Planete, public Maison DANGER! Héritage multiple 7 7 Héritage multiple – Danger #1 : Doublons Supposons que la classe MACLASSE hérite à la fois des classes PARENT1 et PARENT2. Il peut y avoir des problèmes dans les cas suivants : PARENT1 et PARENT2 ont des attributs dont le nom est identique PARENT1 et PARENT2 ont des méthodes dont le nom est identique Solution : utiliser le nom de la classe PARENTX en préfixe et le nom du membre Par exemple PARENT1 et PARENT2 possèdent un attribut monAttribut PARENT1::monAttribut ou PARENT2::monAttribut Utiliser simplement monAttribut? le compilateur vous informera que ce nom est ambigu. Héritage multiple 8 8 4 2024-11-01 Héritage multiple – Danger #2 : Répétition Supposons le cas suivant Les attributs de la classe A sont présents en plusieurs exemplaires dans la classe D A une fois en raison de l'héritage venant de B1 une autre fois pour B2 Une troisième fois par héritage direct sur A B1 B2 Les constructeurs de B1 et de B2 sont sensés appeler tous les deux le D constructeur de A ce qui ne manquera pas de poser de gros problèmes. D « est un » A (3 fois!?!) Héritage multiple 9 9 Héritage multiple – Danger #2 : Répétition A B1 B2 D Héritage multiple 10 10 5 2024-11-01 Héritage multiple – Danger #2 : Répétition A B1 B2 D Héritage multiple 11 11 Héritage multiple – Danger #2 : Répétition A B1 B2 D Héritage multiple ??? 12 12 6 2024-11-01 Héritage multiple – Danger #2 : Répétition A A A B1 B2 D (Ce qui se passe en réalité en mémoire) Héritage multiple 13 13 Héritage virtuel Le contournement au problème d’héritage en diamant est de virtualiser l’héritage Attention, ce n’est pas la solution idéale à tous les problèmes Plus lourd et plus lent en mémoire Rappel moment de liaison : accès déterminé à l’exécution Intérêts Éviter la duplication des attributs Éviter la duplication de l’appel des constructeurs Syntaxe class MACLASSE : virtual public PARENT1 Héritage virtuel 14 14 7 2024-11-01 Héritage virtuel - solution A B1 B2 D Héritage virtuel 15 15 Héritage virtuel – attention (pour compréhension seulement) A B1 B2 A D B1 B2 D Héritage virtuel 16 16 8 2024-11-01 Héritage en diamant et méthodes virtuelles ObjetDessinable Le projet « HeritageMultiple » Situation de base Animation Bouton Les objets sont sur la pile (statique, pas de pointeur) Chaque classe possède la méthode « dessiner » ObjetDessinable.dessiner( ) est virtuel MonBoutonAnime Héritage virtuel 17 17 Héritage en diamant et méthodes virtuelles ObjetDessinable Le projet s’exécute correctement Appel dynamique de la méthode ☺ Animation Bouton MonBoutonAnime Héritage virtuel 18 18 9 2024-11-01 Quelques comportements… La méthode n’est La méthode n’est pas virtuelle du tout ObjetDessinable ObjetDessinable pas virtuelle ici Animation Bouton Animation Bouton MonBoutonAnime MonBoutonAnime Seulement ici Héritage virtuel 19 19 Quelques comportements… La méthode n’est La méthode n’est ObjetDessinable ObjetDessinable pas virtuelle ici pas virtuelle ici Trop tard! Animation Bouton Animation Bouton Trop tard! Virtuel ici MonBoutonAnime MonBoutonAnime Virtuel ici Héritage virtuel 20 20 10 2024-11-01 Un dernier test! Héritage virtuel 21 21 Un dernier test! Héritage virtuel 22 22 11 2024-11-01 Méthode virtuelle pure Une méthode virtuelle pure est une promesse Action de promettre quelque chose Engagement que l'on prend en promettant quelque chose Une classe peut définir une méthode mais ne pas l’implémenter On laisse les enfants « spécialistes » réaliser l’implémentation Il y en a partout! Par exemple, pour la « Forme » virtual int calculerAire( ) = 0; // L’implémentation est NULLE Méthode virtuelle pure 23 23 Abstraction (https://msdn.microsoft.com/fr-fr/library/c8whxhf1.aspx) Les classes abstraites agissent comme des expressions de concepts généraux dont des classes plus spécifiques peuvent être dérivées. Vous ne pouvez pas créer un objet d'un type de classe abstraite En revanche, vous pouvez utiliser des pointeurs et des références à des types de classe abstraite. Une classe contenant au moins une fonction virtuelle pure est considérée comme une classe abstraite. Les classes dérivées de la classe abstraite doivent implémenter la fonction virtuelle pure, sinon elles aussi sont des classes abstraites. Abstraction 24 24 12 2024-11-01 Exemple de méthodes/classes abstraites Echec virtual void deplacer( … ) = 0; Robot virtual void bouger( … ) = 0; virtual void attaquer( … ) = 0; Règle (ou opération) Abstraction 25 25 Un exemple de boucle de jeu (simple) Classe abstraite Le contrôle du jeu est PRIVATE Les détails de l’exécution ne sont pas connus à la compilation Abstraction 26 26 13 2024-11-01 On implémente toutes les méthodes virtuelles pures Abstraction 27 27 Un exemple de boucle de jeu (simple) Abstraction 28 28 14 2024-11-01 Classe abstraite En Java, en C#, et en PHP5 Mot clé : abstract. En C++ Aucune annotation particulière Le compilateur refusera simplement d’instancier l’objet « La méthode dessiner est nulle part et son adresse sera déterminée dynamiquement à l’exécution » Abstraction 29 29 Restrictions sur les classes abstraites (C++ seulement) Les classes abstraites ne peuvent pas être utilisées pour attributs Types d'arguments (paramètres) statique dynamique Abstraction 30 30 15 2024-11-01 Restrictions sur les classes abstraites (C++ seulement) Les classes abstraites ne peuvent pas être utilisées pour Types de retour de fonction Conversions explicites (mais ça fonctionne sur des pointeurs) Abstraction 31 31 Exemple : ObjetDessinable Abstraction 32 32 16 2024-11-01 Interface Java/C# et C++ En Java/C# une « interface » est un type particulier de la classe Il s’agit d’une classe abstraite avec seulement des méthodes virtuelles pures Il n’y a donc pas d’implémentation! Quel est donc son rôle? Alternative à l’héritage multiple Contrôler la structure du fonctionnement de l’exécution mais pas le résultat Syntaxe Java (pour référence seulement) public interface MonInterface public class MaClasse extends Parent implements MonInterface Interface 35 35 Exemple Android (Interface en Java) Je suis un activity mais je vais répondre au « contrat » défini dans l’interface OnClickListener Une méthode abstraite Le contrat est respecté Interface 36 36 17 2024-11-01 En C++… … En Java Un enfant peut redéfinir une ou plusieurs méthodes Réflexion : conception de l’héritage en utilisant les classes abstraites Les méthodes doivent être redéfinies (override) par les enfrants! Interface 38 38 UML Abstract = italique UML 39 39 18 2024-11-01 En C++ Exemple 40 40 Les overrides ne sont pas obligatoires? En C++ Exemple 41 41 19 2024-11-01 Donc, en raison de la virtualisation… Abstraction Implémentation Spécialisation Conclusion 42 42 20

Use Quizgecko on...
Browser
Browser