Concepts de poo pour les débutants: Qu’est-ce que le polymorphisme

Concepts de poo pour les débutants: Qu’est-ce que le polymorphisme

le mot polymorphisme est utilisé dans divers contextes et décrit des situations dans lesquelles quelque chose se produit sous plusieurs formes différentes. En informatique, il décrit le concept selon lequel des objets de différents types sont accessibles via la même interface. Chaque type peut fournir sa propre implémentation indépendante de cette interface. C’est l’un des concepts de base de la programmation orientée objet (POO).,

Si vous vous demandez si un objet est polymorphe, vous pouvez effectuer un test simple. Si l’objet réussit plusieurs tests is-a ou instanceof, il est polymorphe. Comme je l’ai décrit dans mon article sur l’héritage, toutes les classes Java étendent l’objet de classe. Pour cette raison, tous les objets en Java sont polymorphes car ils passent au moins deux contrôles instanceof.,

différents types de polymorphisme

Java prend en charge 2 types de polymorphisme:

  • statique ou à la compilation
  • dynamique

polymorphisme statique

Java, comme beaucoup d’autres langages de programmation orientés objet, vous permet d’implémenter plusieurs méthodes dans la même classe qui utilisent le même C’est ce qu’on appelle la surcharge de méthode et représente une forme statique de polymorphisme.,

Les ensembles de paramètres doivent différer dans au moins un des trois critères suivants:

  • ils doivent avoir un nombre différent de paramètres, par exemple une méthode accepte 2 et une autre 3 paramètres.
  • Les types de paramètres doivent être différents, par exemple une méthode accepte une chaîne et une autre une longue.
  • ils doivent attendre les paramètres dans un ordre différent, par exemple une méthode accepte une chaîne et une longue et une autre accepte une longue et une chaîne. Ce type de surcharge n’est pas recommandé car il rend l’API difficile à comprendre.,

dans la plupart des cas, chacune de ces méthodes surchargées fournit une fonctionnalité différente mais très similaire.

en Raison des différents jeux de paramètres, chaque méthode a une signature différente. Cela permet au compilateur d’identifier la méthode à appeler et de la lier à l’appel de la méthode. Cette approche est appelée liaison statique ou polymorphisme statique.

prenons un coup d’oeil à un exemple.

un exemple simple pour le polymorphisme statique

j’utilise le même projet CoffeeMachine que j’ai utilisé dans les articles précédents de cette série. Vous pouvez le cloner à https://github.com/thjanssen/Stackify-OopInheritance.,

La classe BasicCoffeeMachine implémente deux méthodes avec le nom brewCoffee. Le premier accepte un paramètre de type CoffeeSelection. L’autre méthode accepte deux paramètres, un CoffeeSelection et un int.

Maintenant, lorsque vous appelez l’une de ces méthodes, l’ensemble de paramètres fourni identifie la méthode qui doit être appelée.

dans l’extrait de code suivant, j’appelle la méthode uniquement avec un objet CoffeeSelection. Au moment de la compilation, le compilateur Java lie cet appel de méthode à la méthode brewCoffee(CoffeeSelection selection).,

BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);

Si je modifie ce code et appelle la méthode brewCoffee avec un objet CoffeeSelection et un int, le compilateur lie l’appel de méthode à l’autre méthode brewCoffee(sélection CoffeeSelection, numéro int).

polymorphisme dynamique

Cette forme de polymorphisme ne permet pas au compilateur de déterminer la méthode exécutée. La JVM doit le faire au moment de l’exécution.

dans une hiérarchie d’héritage, une sous-classe peut remplacer une méthode de sa superclasse. Cela permet au développeur de la sous-classe de personnaliser ou de remplacer complètement le comportement de cette méthode.,

Il crée également une forme de polymorphisme. Les deux méthodes, implémentées par la super-et la sous-classe, partagent le même nom et les mêmes paramètres mais fournissent des fonctionnalités différentes.

jetons un coup d’œil à un autre exemple du projet CoffeeMachine.

méthode de remplacement dans une hiérarchie d’héritage

La classe BasicCoffeeMachine est la superclasse de la classe PremiumCoffeeMachine.

Les deux classes fournissent une implémentation de la méthode brewCoffee(CoffeeSelection selection).,

Si vous lisez le post sur l’héritage du concept de POO, vous connaissez déjà les deux implémentations de la méthode brewCoffee. Le BasicCoffeeMachine ne prend en charge que le CoffeeSelection.FILTER_COFFEE. La méthode brewCoffee de la classe PremiumCoffeeMachine ajoute la prise en charge de CoffeeSelection.ESPRESSO. S’il est appelé avec une autre CoffeeSelection, il utilise le mot-clé super pour déléguer l’appel à la superclasse.,

liaison tardive

lorsque vous souhaitez utiliser une telle hiérarchie d’héritage dans votre projet, vous devez pouvoir répondre à la question suivante: Quelle méthode la JVM appellera-t-elle?

Qui ne peut être répondu à l’exécution, car il dépend de l’objet sur lequel la méthode est appelée. Le type de la référence, que vous pouvez voir dans votre code, n’est pas pertinent. Vous devez distinguer trois scénarios généraux:

  1. votre objet est du type de la superclasse et est référencé en tant que superclasse., Ainsi, dans l’exemple de cet article, un objet BasicCoffeeMachine est référencé en tant que BasicCoffeeMachine.
  2. votre objet est du type de la sous-classe et est référencé en tant que sous-classe. Dans l’exemple de cet article, un objet PremiumCoffeeMachine est référencé en tant que PremiumCoffeeMachine.
  3. votre objet est du type de la sous-classe et est référencé comme superclasse. Dans L’exemple CoffeeMachine, un objet PremiumCoffeeMachine est référencé en tant que BasicCoffeeMachine.
superclasse référencée comme la superclasse

le premier scénario est assez simple., Lorsque vous instanciez un objet BasicCoffeeMachine et que vous le stockez dans une variable de type BasicCoffeeMachine, la JVM appellera la méthode brewCoffee sur la classe BasicCoffeeMachine. Donc, vous ne pouvez préparer Qu’un Cafésélection.FILTER_COFFEE.

sous-classe référencée en tant que sous-classe

Le deuxième scénario est similaire. Mais cette fois, j’instancie une PremiumCoffeeMachine et je la référence comme une PremiumCoffeeMachine. Dans ce cas, la JVM appelle la méthode brewCoffee de la classe PremiumCoffeeMachine, qui ajoute la prise en charge de CoffeeSelection.ESPRESSO.,

sous-classe référencée comme superclasse

c’est le scénario le plus intéressant et la principale raison pour laquelle j’explique le polymorphisme dynamique dans de tels détails.

lorsque vous instanciez un objet PremiumCoffeeMachine et l’affectez à la variable BasicCoffeeMachine coffeeMachine, il s’agit toujours d’un objet PremiumCoffeeMachine. Cela ressemble juste à une machine de base.

le compilateur ne le voit pas dans le code, et vous ne pouvez utiliser que les méthodes fournies par la classe BasicCoffeeMachine., Mais si vous appelez la méthode brewCoffee sur la variable coffeeMachine, la JVM sait qu’il s’agit d’un objet de type PremiumCoffeeMachine et exécute la méthode remplacée. Ceci est appelé liaison tardive.

résumé

le polymorphisme est l’un des concepts fondamentaux des langages de POO. Il décrit le concept selon lequel différentes classes peuvent être utilisées avec la même interface. Chacune de ces classes peut fournir sa propre implémentation de l’interface.

Java prend en charge deux types de polymorphisme. Vous pouvez surcharger une méthode avec différents ensembles de paramètres., C’est ce qu’on appelle le polymorphisme statique car le compilateur lie statiquement l’appel de méthode à une méthode spécifique.

dans une hiérarchie d’héritage, une sous-classe peut remplacer une méthode de sa superclasse. Si vous instanciez la sous-classe, la JVM appellera toujours la méthode remplacée, même si vous convertissez la sous-classe en superclasse. C’est ce qu’on appelle le polymorphisme dynamique.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *