Programmation Orientée Objet: Le Polymorphisme

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Quel concept de la programmation orientée objet le polymorphisme complète-t-il principalement?

  • L'abstraction
  • L'encapsulation
  • L'héritage (correct)
  • Le masquage de données

Comment le polymorphisme permet-il de manipuler des objets?

  • En utilisant une interface commune sans connaître totalement le type de chaque objet. (correct)
  • En convertissant chaque objet vers un type spécifique.
  • En connaissant précisément le type de chaque objet.
  • En ignorant le type de chaque objet.

Quelle relation est exploitée par le polymorphisme, notamment illustrée par l'expression anglaise 'is a'?

  • Un point coloré partage une relation d'identité avec un point.
  • La relation réciproque entre un point et un point coloré est toujours vraie.
  • Un point est nécessairement un point coloré.
  • Un point coloré est aussi un point. (correct)

Dans le contexte du polymorphisme, que signifie la liaison dynamique?

<p>Le choix de la méthode à appeler dépend du type effectif de l'objet au moment de l'exécution. (A)</p> Signup and view all the answers

Dans un scénario de polymorphisme avec des classes A, B, C, D, E et F où A est la classe mère et les autres en dérivent, laquelle des affectations suivantes est incorrecte?

<p><code>B b = new A();</code> (C)</p> Signup and view all the answers

Dans un contexte de généralisation du polymorphisme avec plusieurs classes, si 'a' est une instance de la classe A et 'b' une instance de la classe B, et que B hérite de A, laquelle des opérations suivantes est valide?

<p><code>a = b;</code> où a est de type A et b est de type B, avec B héritant de A. (B)</p> Signup and view all the answers

Considérons un arbre d'héritage avec une fonction 'f' définie dans certaines classes. Si 'a' est une référence de type A, mais pointe vers un objet de type D (D héritant de A et ayant sa propre implémentation de 'f'), quelle version de 'f' sera appelée?

<p>La version de 'f' définie dans la classe D. (D)</p> Signup and view all the answers

Dans un programme Java, si une méthode 'f(float x)' est définie dans une classe A, et une méthode 'f(int n)' est définie dans une classe B qui hérite de A, comment appelle-t-on le fait que la classe B possède deux méthodes 'f' avec des signatures différentes?

<p>Surdéfinition (C)</p> Signup and view all the answers

Si une classe B étend une classe A et redéfinit une méthode 'f(float x)' de A, et qu'une instance 'a' de type A est affectée à une instance de type B, lequel des appels suivants est correct en termes de polymorphisme?

<p><code>a.f(n)</code> appellera la méthode 'f(float x)' de B si 'n' peut être converti en float. (A)</p> Signup and view all the answers

Pourquoi est-il conseillé d'utiliser la surdéfinition et la redéfinition avec prudence en programmation orientée objet?

<p>Car cela peut conduire à des situations complexes et difficiles à déboguer. (C)</p> Signup and view all the answers

Dans le contexte de la conversion d'arguments effectifs, si une méthode 'identite()' est définie dans la classe A et n'est pas redéfinie dans la classe B qui hérite de A, quel sera le résultat de l'appel Util.f(b) si b est une instance de B et Util.f(A a) appelle a.identite()?

<p>L'appel de la méthode 'identite()' de A. (D)</p> Signup and view all the answers

Considérant une méthode surdéfinie 'f' dans une classe Util, avec des signatures f(int n, B b) et f(float x, A a), où B hérite de A, quel appel de méthode serait sélectionné sans nécessiter de conversion?

<p><code>Util.f(x, b)</code> avec <code>float x</code> et <code>B b</code> (A)</p> Signup and view all the answers

Dans le cas d'une méthode surdéfinie (exemple moins trivial) avec les signatures f(int p, A a) et f(float x, B b), où B hérite de A, quel appel provoquerait une erreur de compilation due à l'ambiguïté?

<p><code>Util.f(n, b)</code> (C)</p> Signup and view all the answers

Dans le contexte des règles de polymorphisme en Java, laquelle des affirmations suivantes est correcte concernant la conversion implicite?

<p>Il existe une conversion implicite d'une référence à un objet de classe C en une référence à un objet d'une classe ascendante. (A)</p> Signup and view all the answers

Quelle est la conséquence d'essayer d'affecter une référence à un objet de type T à une référence d'un type ascendant sans conversion explicite?

<p>Cela provoque une erreur de compilation. (A)</p> Signup and view all the answers

Quelle est la méthode recommandée pour vérifier la compatibilité des types en Java lors d'une conversion explicite de référence?

<p>Utiliser l'opérateur <code>instanceof</code>. (B)</p> Signup and view all the answers

Quelle est la classe de base dont toutes les classes en Java dérivent implicitement?

<p><code>Object</code> (C)</p> Signup and view all the answers

Si une variable est déclarée comme étant de type Object, que peut-on affirmer quant aux objets qu'elle peut référencer?

<p>Elle peut référencer un objet de n'importe quel type. (A)</p> Signup and view all the answers

Si une variable o est de type Object et qu'elle référence un objet de type Point, pourquoi l'instruction o.deplacer() génère-t-elle une erreur à la compilation, et comment peut-on corriger cela?

<p>L'erreur est due à une incompatibilité de types. Correction : <code>((Point) o).deplacer()</code>. (C)</p> Signup and view all the answers

Quel est le but principal de la méthode toString() dans la classe Object?

<p>Retourner une représentation textuelle de l'objet. (C)</p> Signup and view all the answers

Quelle est la fonctionnalité par défaut de la méthode equals() héritée de la classe Object?

<p>Comparer les adresses mémoire des objets. (A)</p> Signup and view all the answers

Dans le contexte des droits d'accès en Java, à quoi sert le modificateur protected?

<p>Permettre l'accès aux membres aux classes dérivées et aux classes du même paquetage. (B)</p> Signup and view all the answers

Considérons une classe A avec un membre protected int n. Si une classe B étend A et une classe C n'a pas de relation d'héritage avec A, mais est dans le même paquetage que A, laquelle des classes peut accéder directement à n?

<p>Les classes A, B et C. (C)</p> Signup and view all the answers

En Java, laquelle des affirmations suivantes est vraie concernant les tableaux et l'héritage?

<p>Un tableau peut être considéré comme appartenant à une classe dérivée d'Object. (A)</p> Signup and view all the answers

Si B dérive de A, quelle est la relation de compatibilité entre un tableau d'objets de type B et un tableau d'objets de type A?

<p>Un tableau de B est compatible avec un tableau de A. (A)</p> Signup and view all the answers

Quelle est la principale limitation de l'application du polymorphisme aux tableaux de types primitifs en Java?

<p>Les conversions entre les tableaux de types primitifs ne sont pas autorisées implicitement. (A)</p> Signup and view all the answers

Quelle est la conséquence de déclarer une méthode comme final en Java dans le contexte de l'héritage?

<p>La méthode ne peut pas être redéfinie dans les classes dérivées. (B)</p> Signup and view all the answers

Que se passe-t-il si une classe est déclarée comme final en Java?

<p>Elle ne peut pas être héritée. (A)</p> Signup and view all the answers

Considérons le code Java suivant:

class A {
    public void f(float x) { }
}
class B extends A {
    public void f(float x) { }
    public void f(int n) { }
}
A a = new A();
B b = new B();
int n = 5;
a.f(n);

Quelle version de f est appelée pour a.f(n)?

<p><code>f(float x)</code> de la classe A (D)</p> Signup and view all the answers

Considérons le code Java suivant:

class Point {
    public void afficher() { System.out.println("Point"); }
}
class PointCol extends Point {
    public void afficher() { System.out.println("PointCol"); }
}
Point p = new PointCol();
p.afficher();

Quelle sortie sera affichée lors de l'exécution de ce code?

<p><code>PointCol</code> (D)</p> Signup and view all the answers

Considérant les classes suivantes:

class A {}
class B extends A {}
class Util {
    public static void f(A a) {}
}

Si b est une instance de B, que se passe-t-il lors de l'appel Util.f(b)?

<p>La méthode <code>f(A a)</code> est appelée avec <code>b</code> implicitement converti en <code>A</code>. (B)</p> Signup and view all the answers

Quel est le principal avantage du polymorphisme en programmation orientée objet?

<p>Permettre de traiter des objets de différentes classes de manière uniforme. (B)</p> Signup and view all the answers

Quelle instruction permet de déterminer le type effectif d'un objet en Java lors de l'exécution?

<p><code>getClass()</code> (C)</p> Signup and view all the answers

Lors de l'appel d'une méthode sur un objet, comment le compilateur détermine-t-il quelle signature de méthode utiliser en présence de surdéfinition?

<p>En utilisant le type déclaré de l'objet au moment de la compilation. (D)</p> Signup and view all the answers

Si une méthode est redéfinie dans une sous-classe, et qu'un objet de cette sous-classe est référencé par une variable du type de la super-classe, quelle version de la méthode est exécutée?

<p>La version de la sous-classe (A)</p> Signup and view all the answers

Dans quel contexte la ligature dynamique est-elle particulièrement importante en programmation objet?

<p>Lors de l'exécution du code, en particulier avec le polymorphisme (B)</p> Signup and view all the answers

Flashcards

Polymorphisme

Concept puissant en P.O.O qui complète l'héritage.

Compatibilité d'affection

Une variable objet peut pointer vers un objet d'un type dérivé.

Ligature dynamique

Le choix s'effectue au moment de l'exécution selon le type réel de l'objet.

Traduction du polymorphisme

Compatibilité par affectation et ligature dynamique des méthodes.

Signup and view all the flashcards

Compatibilité (polymorphisme)

Une conversion implicite d'un type à un type ascendant.

Signup and view all the flashcards

Ligature statique

Détermine la signature de la méthode convenable.

Signup and view all the flashcards

Ligature dynamique

Recherche la méthode avec le type effectif de l'objet

Signup and view all the flashcards

La classe Object

Classe java au sommet de la hiérarchie des classes.

Signup and view all the flashcards

Membres protégés

Accès limité aux classes dérivées et au même paquetage.

Signup and view all the flashcards

Le mot clé 'final'

Indique qu'une variable ne peut être modifiée après initialisation.

Signup and view all the flashcards

Class et méthodes finales

Une méthode qui ne peut être redéfinie, ou une classe ne peut pas être dérivée.

Signup and view all the flashcards

Polymorphisme

Concept qui permet à un objet de prendre plusieurs formes.

Signup and view all the flashcards

Surdéfinition (Overloading)

Une méthode avec le même nom mais des paramètres différents.

Signup and view all the flashcards

Redéfinition (Overriding)

Modifier le comportement d'une method heritée.

Signup and view all the flashcards

Study Notes

La notion de polymorphisme

  • C'est un concept puissant en Programmation Orientée Objet (P.O.O.) qui complète l'héritage.
  • Permet de manipuler des objets sans connaître entièrement leur type.
  • Exemple de polymorphisme : créer un tableau d'objets de types différents tels que Point et PointCol et appeler la méthode afficher().
  • Chaque objet réagit selon son type spécifique.
  • Exploite la relation « est un » (en anglais « is a »), signifiant qu'un point coloré est aussi un point et peut donc être traité comme tel, mais l'inverse n'est pas vrai.

Les bases du polymorphisme

  • Une variable objet peut référencer un objet d'un type dérivé.
  • Le choix de la méthode appelée se fait selon le type effectif de l'objet référencé au moment de l'exécution.
  • Le polymorphisme se traduit par la compatibilité par affectation entre un type classe et un type ascendant et par la ligature dynamique des méthodes.

Généralisation du polymorphisme à plusieurs classes

  • Étant donné une hiérarchie de classes où A est la classe mère et B, C, D, E, F sont des sous-classes, les affectations suivantes sont possibles :
    • a = b; (OUI)
    • a = c; (OUI)
    • a = d; (OUI)
    • a = e; (OUI)
    • b = e; (OUI)
    • c = f; (OUI)

Application des méthodes dans une hiérarchie de classes

  • Si une fonction f est définie/redéfinie dans les classes A, C et D (indiqué par un astérisque), la méthode appelée dépend du type de référence.
  • a référence un objet de type A : méthode f de A est appelée.
  • a référence un objet de type B : méthode f de A est appelée.
  • a référence un objet de type C : méthode f de C est appelée.
  • a référence un objet de type D : méthode f de D est appelée.
  • a référence un objet de type E : méthode f de A est appelée.
  • a référence un objet de type F : méthode f de C est appelée.

Polymorphisme, redéfinition et surdéfinition

  • Illustration des concepts avec un exemple de code où la classe B étend la classe A.
  • La classe A a une méthode f(float x). et la classe B redéfinit la méthode f(float x) et ajoute une méthode f(int n).
  • Explication du comportement de a.f(n), et de b.f(n) et enfin de a = b puis a.f(n)

Explication du polymorphisme

  • Bien que a.f(n) et b.f(n) appliquent une méthode f à un objet de type B, elles n'appellent pas la même méthode.
  • Pour l'instruction a.f(n), le compilateur recherche la meilleure méthode parmi les méthodes de la classe A ou ses ascendantes, selon les règles de surdéfinition.
  • Une fois la bonne méthode trouvée, sa signature et son type de retour sont figés.
  • Lors de l'exécution, le polymorphisme se base sur la signature et le type de retour définis à la compilation, qui ne sont pas remis en question lors de l'exécution.

Recommandation sur l'utilisation de la surdéfinition et de la redéfinition

  • Il est conseillé d'utiliser la surdéfinition et la redéfinition prudemment et de ne pas en abuser, car leur utilisation simultanée peut conduire à des situations complexes.

Conversion des arguments effectifs

  • Cas d'arguments de type objet :
  • Méthode non surdéfinie et non redéfinie :
    • Démonstration avec des classes A et B où B étend A.
    • La méthode identite() est définie dans A et non redéfinie dans B.
    • Utilisation de la classe Util pour appeler f(A a).
    • L'appel de Util.f(b) affiche « Objet de type A ».
  • Méthode non surdéfinie et redéfinie :
    • La méthode identite() est redéfinie dans B.
    • L'appel de Util.f(b) affiche « Objet de type B ».

Conversion des arguments effectifs - Cas 3 : Méthode surdéfinie (exemple simple)

  • Démonstration avec des classes A et B étendant A, et une classe Util contenant des méthodes statiques surdéfinies f(int n, B b) et f(float x, A a).
  • Les appels : Util.f(n, b) appel de f(int, B) sans conversion.
  • Util.f(x, a) appel de f(float, A) sans conversion.
  • Util.f(n, a) conversion de n en float pour appeler f(float, A).
  • Util.f(x, b) conversion de b en A pour appeler f(float, A).

Conversion des arguments effectifs - Cas 3 : Méthode surdéfinie (exemple moins trivial)

  • La classe A et la classe B étendent la classe A.
  • La classe Util possède les méthodes f(int p, A a) et f(float x, B b).
  • Les appels suivants sont analysés :
    • Util.f(n, a) appel de f(int, A) sans conversion.
    • Util.f(x, b) appel de f(float, B) sans conversion.
    • Util.f(n, b) ambiguïté car deux possibilités existent.
    • Util.f(x, a) erreur car aucune méthode ne convient.

Règles du polymorphisme en Java

  • Compatibilité : conversion implicite d'une référence à un objet de classe C en une référence à un objet d'une classe ascendante.
  • Ligature dynamique : choix de la méthode se fait à la compilation et à l'exécution.
    • A la compilation on détermine la signature de la meilleure méthode.
    • A l'exécution on recherche la méthode correspondant au type effectif de l'objet.

Conversion explicite de référence

  • Il n'est pas possible d'affecter une référence à un objet de type T à un objet d'un type ascendant sans conversion explicite.
  • Nécessité d'utiliser l'opérateur de cast pour les types primitifs.
  • Conversion acceptée par le compilateur mais vérifiée à l'exécution.
  • Utilisation de instanceof pour vérifier la compatibilité des types.
  • Utilisation de getClass() pour connaître le type effectif d'un objet.

La super-classe Object

  • La classe Object est le sommet de la hiérarchie de toutes les classes Java.
  • Toutes les classes dérivent de la classe Object, qu'elles soient prédéfinies ou créées.
  • Cela équivaut à class Point extends Object.

Utilisation d'une référence de type Object

  • Une variable de type Object peut référencer un objet de type quelconque grâce au polymorphisme.
  • Ceci permet de manipuler des objets dont le type exact n'est pas connu au moment de l'utilisation.
  • Exemple de code : Point p = new Point(); Object o = p; l'appel de méthode : ((Point) o).deplacer (); est correct.
  • La classe Object comporte des méthodes que l'on peut utiliser telles quelles ou les redéfinir.
    • toString() :fournit le nom de la classe et l'adresse de l'objet en hexadécimal.
    • equals() compare les adresses de deux objets.

Les membres protégés

  • Les droits d'accès sont public, private et protected.
  • Un membre déclaré protected est accessible à ses classes dérivées et aux classes du même paquetage.
  • Membres protected et héritage : Si C n'accède pas à n de B (sauf si B et C sont dans le même paquetage) car aucun lien de dérivation ne relie C à B

Héritage et tableaux

  • Les tableaux sont considérés comme des objets, mais ne bénéficient pas de toutes les propriétés des objets car il n'est pas possible de définir leur classe.
  • Un tableau peut être considéré comme appartenant à une classe dérivée d'Object :
    • Object o = new int[5]; // correct.
  • Il n'est pas possible de dériver une classe d'un tableau :
    • class Test extends int[]; // erreur.

Polymorphisme et tableaux

  • Le polymorphisme peut s'appliquer aux tableaux d'objets.
  • Si B dérive de A, un tableau d'objets de type B est compatible avec un tableau d'objets de type A :
    • A ta[] ; B tb[] ; ta = tb ; // OK car B dérive de A
  • Cette propriété ne s'applique pas aux types primitifs :
    • int ti[] ; float tf[] ; ti = tf ; // erreur

Classes et méthodes finales

  • Le mot clé final appliqué à une variable ou à un champ d'une classe interdit la modification de sa valeur.
  • Appliqué à une classe ou à une méthode, le mot clé `final`` a une signification différente.
  • Une méthode déclarée finale ne peut pas être redéfinie dans une classe dérivée.
  • Une classe déclarée finale ne peut pas être dérivée.

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

More Like This

Use Quizgecko on...
Browser
Browser