Question Qu'est-ce que le polymorphisme, à quoi sert-il et comment est-il utilisé?


Je regardais un Google Tech Talks vidéo, et ils ont souvent fait référence au polymorphisme.

Qu'est-ce que le polymorphisme, à quoi sert-il et comment est-il utilisé?


457
2018-06-23 08:14


origine


Réponses:


Si vous pensez aux racines grecques du terme, cela devrait devenir évident.

  • Poly = beaucoup: polygone = multi-faces, polystyrène = beaucoup de styrènes (une), polyglotte = plusieurs langues, etc.
  • Morph = changement ou forme: morphologie = étude de la forme biologique, Morpheus = le dieu grec des rêves capable de prendre n'importe quelle forme.

Le polymorphisme est donc la capacité (en programmation) de présenter la même interface pour différentes formes sous-jacentes (types de données).

Par exemple, dans de nombreux langages, les entiers et les flottants sont implicitement polymorphes car vous pouvez ajouter, soustraire, multiplier, etc., indépendamment du fait que les types sont différents. Ils sont rarement considérés comme des objets dans le terme habituel.

Mais de la même manière, une classe comme BigDecimal ou Rational ou Imaginary peut également fournir ces opérations, même si elles fonctionnent sur des types de données différents.

L'exemple classique est le Shape classe et toutes les classes qui peuvent en hériter (carré, cercle, dodécaèdre, polygone irrégulier, splat et ainsi de suite).

Avec le polymorphisme, chacune de ces classes aura des données sous-jacentes différentes. Une forme de point n'a besoin que de deux coordonnées (en supposant que ce soit dans un espace à deux dimensions bien sûr). Un cercle a besoin d'un centre et d'un rayon. Un carré ou un rectangle nécessite deux coordonnées pour les coins supérieur gauche et inférieur droit et (éventuellement) une rotation. Un polygone irrégulier a besoin d'une série de lignes.

En rendant la classe responsable de son code ainsi que de ses données, vous pouvez réaliser le polymorphisme. Dans cet exemple, chaque classe aurait ses propres Draw() fonction et le code client pourrait simplement faire:

shape.Draw()

pour obtenir le comportement correct pour n'importe quelle forme.

Ceci est en contraste avec l'ancienne façon de faire dans laquelle le code était séparé des données, et vous auriez eu des fonctions telles que drawSquare() et drawCircle().

L'orientation des objets, le polymorphisme et l'héritage sont tous des concepts étroitement liés et ils sont essentiels à connaître. Il ya eu beaucoup de "balles d’argent" au cours de ma longue carrière, qui se sont tout simplement soldées par un échec, mais le paradigme de l’OO s’est avéré être un bon exemple. Apprenez-le, comprenez-le, aimez-le - vous serez heureux de l'avoir fait :-)


(une) J'ai d'abord écrit cela comme une blague, mais il s'est avéré correct et, par conséquent, pas si drôle. Le momomer styrène est fabriqué à partir de carbone et d'hydrogène, C8H8, et le polystyrène est fabriqué à partir de groupes de cela, (C8H8)n.

Peut-être que j'aurais dû dire qu'un polype était plusieurs occurrences de la lettre p Bien que, maintenant que j'ai dû expliquer la blague, même cela ne semble pas drôle non plus.

Parfois, vous devriez juste quitter pendant que vous êtes derrière :-)


458
2018-06-23 08:44



Le polymorphisme, c'est quand vous pouvez traiter un objet comme une version générique de quelque chose, mais lorsque vous y accédez, le code détermine quel type est exactement et appelle le code associé.

Voici un exemple en C #. Créez quatre classes dans une application de console:

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

Créez maintenant ce qui suit dans Main () du module pour l'application console:

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

Dans cet exemple, nous créons une liste de la classe de base Vehicle, qui ne connaît pas le nombre de roues de chacune de ses sous-classes, mais qui sait que chaque sous-classe est responsable de savoir combien de roues elle possède.

Nous ajoutons ensuite un vélo, une voiture et un camion à la liste.

Ensuite, nous pouvons parcourir chaque véhicule de la liste et les traiter tous de la même façon. Cependant, lorsque nous accédons à la propriété de chaque véhicule, la classe Véhicule délègue l'exécution de ce code à la sous-classe concernée.

Ce code est dit polymorphe, car le code exact qui est exécuté est déterminé par la sous-classe référencée à l'exécution.

J'espère que cela vous aidera.


207
2018-06-24 13:25



De Comprendre et appliquer le polymorphisme en PHP, Merci Steve Guidetti.

Le polymorphisme est un mot long pour un concept très simple.

Le polymorphisme décrit un modèle de programmation orientée objet dans lequel les classes ont des fonctionnalités différentes tout en partageant une interface commune.

La beauté du polymorphisme est que le code qui travaille avec les différentes classes n'a pas besoin de savoir quelle classe il utilise car elles sont toutes utilisées de la même manière.   Une analogie du monde réel pour le polymorphisme est un bouton. Tout le monde sait comment utiliser un bouton: vous exercez simplement une pression sur celui-ci. Ce qu'un bouton "fait", cependant, dépend de ce à quoi il est connecté et du contexte dans lequel il est utilisé - mais le résultat n'affecte pas la façon dont il est utilisé. Si votre patron vous demande d'appuyer sur un bouton, vous disposez déjà de toutes les informations nécessaires pour effectuer la tâche.

Dans le monde de la programmation, le polymorphisme est utilisé pour rendre les applications plus modulaires et extensibles. Au lieu d'instructions conditionnelles désordonnées décrivant différentes actions, vous créez des objets interchangeables que vous sélectionnez en fonction de vos besoins. C'est l'objectif fondamental du polymorphisme.


178
2017-11-04 05:17



Si quelqu'un dit CUT à ces personnes

  1. Le chirurgien
  2. Le coiffeur
  3. L'acteur

Que va-t-il arriver?

  • Le chirurgien commencerait à faire une incision.
  • Le coiffeur commencerait à couper les cheveux de quelqu'un.
  • L'acteur cesserait brusquement d'agir sur la scène actuelle, en attente de conseils de direction.

La représentation ci-dessus montre donc ce qu'est le polymorphisme (même nom, comportement différent) dans la POO.

Si vous vous présentez pour une entrevue et que l'intervieweur vous demande de montrer / montrer un exemple vivant de polymorphisme dans la même pièce où nous sommes assis, dites ...

Réponse - Porte / Fenêtres

Vous vous demandez comment?

Par porte / fenêtre - une personne peut venir, de l'air peut venir, de la lumière peut venir, de la pluie peut venir, etc.

Pour mieux le comprendre et d'une manière simple j'ai utilisé l'exemple ci-dessus .. Si vous avez besoin de référence pour le code, suivez les réponses ci-dessus.


45
2017-11-15 11:48



Polymorphisme: 

C'est le concept de programmation orientée objet. La capacité de différents objets à répondre, chacun à sa manière, à des messages identiques est appelée polymorphisme.

Le polymorphisme résulte du fait que chaque classe vit dans son propre espace de noms. Les noms attribués dans une définition de classe ne sont pas en conflit avec les noms attribués ailleurs qu'en dehors. Cela est vrai à la fois pour les variables d'instance dans la structure de données d'un objet et pour les méthodes de l'objet:

  • Tout comme les champs d'une structure C sont dans un espace de noms protégé, sont les variables d'instance d'un objet.

  • Les noms de méthodes sont également protégés. Contrairement aux noms de fonctions C, les noms de méthodes ne sont pas des symboles globaux. Le nom d'une méthode dans un la classe ne peut pas entrer en conflit avec les noms de méthodes d'autres classes; deux Des classes très différentes peuvent implémenter des méthodes nommées de manière identique.

Les noms de méthodes font partie de l'interface d'un objet. Lorsqu'un message est envoyé demandant qu'un objet fasse quelque chose, le message nomme la méthode que l'objet doit exécuter. Parce que différents objets peuvent avoir des méthodes avec le même nom, la signification d'un message doit être comprise par rapport à l'objet particulier qui reçoit le message. Le même message envoyé à deux objets différents peut invoquer deux méthodes distinctes.

Le principal avantage du polymorphisme est qu'il simplifie l'interface de programmation. Il permet d'établir des conventions qui peuvent être réutilisées en classe après classe. Au lieu d'inventer un nouveau nom pour chaque nouvelle fonction que vous ajoutez à un programme, les mêmes noms peuvent être réutilisés. L'interface de programmation peut être décrite comme un ensemble de comportements abstraits, indépendamment des classes qui les implémentent.

Exemples:

Exemple 1: Voici un exemple simple écrit en Python 2.x.

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

Exemple 2: Le polymorphisme est implémenté dans Java utilisant la méthode surcharge et méthode primordial concepts

Prenons un exemple de voiture pour discuter du polymorphisme. Prenez n'importe quelle marque comme Ford, Honda, Toyota, BMW, Benz etc., Tout est de type Voiture.

Mais chacun a ses propres fonctionnalités avancées et une technologie plus avancée impliquée dans son comportement de déplacement.

Maintenant, laissez-nous créer un type de base de voiture

Car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

Laissez-nous implémenter l'exemple Ford Car.

Ford étend le type Car pour hériter de tous ses membres (propriétés et méthodes).

Ford.java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

La classe Ford ci-dessus étend la classe Car et implémente également la méthode move (). Même si la méthode de déménagement est déjà disponible pour Ford à travers l'héritage, Ford a encore mis en œuvre la méthode à sa manière. C'est ce qu'on appelle le remplacement de méthode.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Tout comme Ford, Honda étend également le type de voiture et a implémenté la méthode de déplacement à sa manière.

La substitution de méthode est une fonctionnalité importante pour activer le polymorphisme. En utilisant la substitution de méthode, les sous-types peuvent changer le fonctionnement des méthodes disponibles via l'héritage.

PolymorphismExample.java

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

Sortie d'exemple de polymorphisme:

Dans la méthode principale de la classe PolymorphismExample, j'ai créé trois objets: Car, Ford et Honda. Tous les trois objets sont référencés par le type de voiture.

S'il vous plaît noter un point important ici qu'un type de super classe peut se référer à un type d'objet de sous-classe, mais le vice-verset n'est pas possible. La raison en est que tous les membres de la super classe sont disponibles pour la sous-classe en utilisant l'héritage et pendant la compilation, le compilateur essaie d'évaluer si le type de référence que nous utilisons a la méthode à laquelle il essaie d'accéder.

Donc, pour les références car, f et h dans le PolymorphismExample, la méthode de déplacement existe depuis le type Car. Ainsi, le compilateur passe le processus de compilation sans aucun problème.

Mais quand il s'agit de l'exécution de l'exécution, la machine virtuelle appelle les méthodes sur les objets qui sont des sous-types. Ainsi, la méthode move () est invoquée à partir de leurs implémentations respectives.

Ainsi, tous les objets sont de type Car, mais pendant l'exécution, l'exécution dépend de l'objet sur lequel l'invocation a lieu. C'est ce qu'on appelle le polymorphisme.


20
2018-02-05 13:41



Le polymorphisme est la capacité de traiter une classe d'objet comme s'il s'agissait de la classe parente.

Par exemple, supposons qu'il existe une classe appelée Animal et une classe appelée Dog qui hérite de Animal. Le polymorphisme est la capacité à traiter n'importe quel objet Chien comme un objet Animal comme ceci:

Dog* dog = new Dog;
Animal* animal = dog;

19
2018-06-23 08:20



Explication simple par analogie

(Avant que tu lises: vous devez savoir ce qu'est une interface, et ce qu'est l'héritage. Sans cela, vous pourriez avoir du mal à comprendre le polymorphisme.)

Le président des États-Unis emploie le polymorphisme. Comment? Eh bien, il a beaucoup de conseillers:

  1. Conseillers militaires
  2. Conseillers juridiques
  3. Physiciens nucléaires (en tant que conseillers)
  4. Conseillers médicaux
  5. etc.

Tout le monde ne devrait être responsable que d'une chose: Exemple: 

Le président n'est pas un expert en revêtement de zinc ou en physique quantique. Il ne connaît pas beaucoup de choses - mais il ne connaît qu'une seule chose: comment gérer le pays.

Il en va de même avec le code: les préoccupations et les responsabilités doivent être séparées pour les classes / personnes concernées. Autrement, le président connaîtrait littéralement tout ce qu'il y a dans le monde - tout Wikipédia. Imaginez que vous ayez toute la wikipedia dans une classe de votre code: ce serait un cauchemar à maintenir.

Pourquoi est-ce une mauvaise idée pour un président de connaître toutes ces choses spécifiques?

Si le président devait spécifiquement dire aux gens quoi faire, cela signifierait que le président doit connaître exactement quoi faire. Si le président a besoin de connaître lui-même certaines choses, cela signifie que lorsque vous devez apporter un changement, vous devez le faire à deux endroits, pas seulement un.

Par exemple, si l'EPA modifie les lois sur la pollution, alors quand cela se produit: vous devez apporter une modification à la classe EPA et aussi la classe de président. Changer de code à deux endroits plutôt qu'un seul peut être dangereux - parce qu'il est beaucoup plus difficile à maintenir.

Est-ce qu'il y a une meilleure approche?

Il y a une meilleure approche: le président n'a pas besoin de connaître les détails de quoi que ce soit - il peut demander les meilleurs conseils, auprès de personnes spécifiquement chargées de faire ces choses.

Il peut utiliser une approche polymorphe pour gérer le pays.

Exemple - d'utiliser une approche polymorphe:

Tout ce que fait le président, c'est demander aux gens de le conseiller - et c'est ce qu'il fait dans la vraie vie - et c'est ce qu'un bon président devrait faire. ses conseillers répondent tous différemment, mais ils savent tous ce que signifie le président: Conseiller (). Il a des centaines de personnes en streaming dans son bureau. Cela ne compte pas vraiment qui ils sont. Tout ce que le président sait, c'est que lorsqu'il leur demande de "conseiller", ils savent comment réagir en conséquence.:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        Petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        Condolezza.Advise(); // # she says negotiate trade deal with Iran
        HealthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

Cette approche permet au président de diriger le pays à la lettre sans rien savoir des choses militaires, des soins de santé ou de la diplomatie internationale: les détails sont laissés aux experts. La seule chose que le président doit savoir est la suivante: "Conseiller ()".

Ce que vous ne voulez pas:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

NON! NON! NON! Dans le scénario ci-dessus, le président fait tout le travail: il connaît l'augmentation du nombre de troupes et des conditions préexistantes. Cela signifie que si les politiques du Moyen-Orient changent, alors le président devrait changer ses commandes, aussi bien que la classe Petraeus aussi. Nous devrions seulement devoir changer la classe de Petraeus, parce que le président ne devrait pas devoir s'enliser dans ce genre de détail. Il n'a pas besoin de connaître les détails. Tout ce qu'il doit savoir, c'est que s'il passe une commande, tout sera pris en charge. Tous les détails doivent être laissés aux experts.

Cela permet au président de faire ce qu'il fait le mieux: définir la politique générale, bien paraître et jouer au golf: P.

Comment est-il réellement mis en œuvre - via une classe de base ou une interface commune

C'est en fait le polymorphisme, en un mot. Comment ça se passe exactement? Grâce à "la mise en œuvre d'une interface commune" ou en utilisant une classe de base (héritage) - voir les réponses ci-dessus qui le détaillent plus clairement. (Afin de mieux comprendre ce concept, vous devez savoir ce qu'est une interface, et vous aurez besoin de comprendre ce qu'est l'héritage.

En d'autres termes, Petraeus, Condi et HealthOfficials seraient tous des classes qui "implémentent une interface" - appelons ça le IAdvisor interface qui ne contient qu'une seule méthode: Advise(). Mais maintenant nous entrons dans les détails.

Ce serait idéal

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials, Petraeus etc. The president has no idea who it will be. But he does know that he can ask them to "advise" and that's all Mr Prez cares for.
        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

Résumé

Tout ce que vous devez vraiment savoir, c'est ceci:

  • Le président n'a pas besoin de connaître les détails - ceux-ci sont laissés à d'autres.
  • Tout ce que le président a besoin de savoir, c'est de demander qui entrera dans la maison pour le conseiller - et nous savons qu'il saura absolument quoi faire lorsqu'on lui demandera conseil (parce qu'ils sont tous en réalité, conseillers (ou conseillers) :)

J'espère vraiment que cela vous aidera. Si vous ne comprenez rien, postez un commentaire et je réessayerai.


17
2017-10-29 00:17



Habituellement, cela se réfère à la possibilité pour un objet de type A de se comporter comme un objet de type B. Dans la programmation orientée objet, ceci est généralement réalisé par héritage. Quelques liens Wikipedia pour en savoir plus:

EDIT: corrigé les liens brisés.


8
2018-06-23 08:18



Le polymorphisme est ceci:

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

vous ne pouvez passer qu'une coupe au lieu d'une instance spécifique. Cela facilite la généralité car il n'est pas nécessaire de fournir une instance de mesure spécifique () pour chaque type de cupule.


7
2018-06-24 13:07



Je sais que c'est une question plus ancienne avec beaucoup de bonnes réponses mais je voudrais inclure une réponse en une phrase:

Traiter un type dérivé comme s'il s'agissait de son type de base.

Il y a beaucoup d'exemples ci-dessus qui montrent cela en action, mais je pense que c'est une bonne réponse concise.


6
2017-10-17 21:18



(Je parcourais un autre article sur quelque chose de complètement différent ... et le polymorphisme a surgi ... Maintenant, je pensais que je savais ce que Polymorphism était ... mais apparemment pas si bien expliqué ... Je voulais l'écrire quelque part .. mieux encore le partager ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

lire de cette partie:

..... polymorphisme. C'est une façon geek de dire que différents noms peuvent être appliqués au même verbe.


6
2018-01-14 10:59