web-dev-qa-db-fra.com

Polymorphisme - Définir en seulement deux phrases

J'ai examiné d'autres définitions et explications et aucune d'elles ne me satisfait. Je veux voir si quelqu'un peut définir le polymorphisme en deux phrases au maximum sans utiliser de code ou d'exemples. Je ne veux pas entendre «Vous avez donc une personne/une voiture/un ouvre-boîte ...» ou comment la Parole est dérivée (personne n'est impressionné par le fait que vous sachiez ce que poly et morph signifie). Si vous comprenez très bien ce qu'est le polymorphisme et maîtrisez l'anglais, vous devriez être en mesure de répondre à cette question dans une définition courte, bien que dense. Si votre définition définit avec précision le polymorphisme mais est si dense qu'elle nécessite quelques relectures, c'est exactement ce que je recherche.

Pourquoi seulement deux phrases? Parce qu'une définition est courte et intelligente. Une explication est longue et contient des exemples et du code. Regardez ici pour des explications (la réponse sur ces pages n'est pas satisfaisante pour ma question):

Polymorphisme vs dérogation vs surcharge
Essayez de décrire le polymorphisme aussi facilement que vous le pouvez

Pourquoi je pose cette question? Parce que la même question m’était posée et que j’étais incapable d’arriver à une définition satisfaisante (selon mes critères, qui sont assez élevés). Je veux voir si l'un des grands esprits de ce site peut le faire.

Si vous ne pouvez vraiment pas imposer l'exigence de deux phrases (c'est un sujet difficile à définir), alors c'est bien si vous passez au-dessus. L'idée est d'avoir une définition qui définit réellement ce qu'est le polymorphisme et n'explique pas ce qu'il fait ni comment l'utiliser (comprendre la différence?).

80
Mark Testa

Le polymorphisme permet l'expression d'un type de contrat, de nombreux types pouvant implémenter ce contrat (via l'héritage de classe ou non) de différentes manières, chacune selon son propre objectif. Code using ce contrat ne devrait pas (*) avoir à se soucier de la mise en œuvre impliquée, il faut seulement que le contrat soit respecté.

(*) Dans l’idéal, de toute façon - le code appelant a bien souvent choisi délibérément l’implémentation appropriée!

95
Jon Skeet

Les fruits peuvent être consommés, en règle générale, mais différents types de fruits sont consommés de différentes manières. Une pomme, qui est un fruit, peut être mangée (parce que c'est un fruit). On peut aussi manger une banane (parce que c'est aussi un fruit), mais d'une manière différente de celle d'une pomme. Vous épluchez d'abord.

Au moins, oui, mais je suis bizarre de certaines manières, alors que sais-je?.

Ceci illustre l'héritage (le fruit peut être mangé), le polymorphisme (quelque chose qui mange un fruit peut manger tous les types de fruits) et l'encapsulation (une banane a une peau).

Sérieusement, l'héritage d'objet, le polymorphisme, l'encapsulation, les objets virtuels, les objets abstraits, les objets privés, les objets publics sont autant de concepts difficiles. Si quelqu'un veut absolument avoir une définition en deux phrases, merci de marquer la question en tant que variante code-golf, car deux phrases de ce type devront être si concises que si vous ne savez pas ce que c'est déjà, vous n'en saurez pas assez pour savoir ce dont vous avez besoin d’apprendre davantage.

Polymorphism est la déclaration d'une interface uniforme qui n'est pas sensible au type, laissant les détails d'implémentation aux types concrets qui implémentent l'interface.

44
Eran Galperin

En réalité, il existe plusieurs formes de polymorphisme qui suscitent une vive controverse. vous pouvez même voir des professeurs de CS qui ne peuvent pas le définir correctement. Je suis conscient de trois types:

  • polymorphisme ad hoc (ressemble à un canard et marche comme un canard => est un canard). Peut être vu dans Haskell et Python par exemple.

  • polymorphisme générique (où un type est une instance d'un type générique). Peut être vu en C++ par exemple (les vecteurs de int et de string ont tous les deux une taille de fonction membre).

  • polymorphisme de sous-type (où un type hérite d'un autre type). Peut être vu dans la plupart des langages de programmation OO (c'est-à-dire que Triangle est une forme).

20
Afd

Wikipedia: Le polymorphisme est une fonctionnalité de langage de programmation qui permet de gérer les valeurs de différents types de données à l'aide d'une interface uniforme. Assez simple pour moi.

19
Otávio Décio

Je comprends vraiment pourquoi vous posez cette question. Je comprends le polymorphisme, mais j'étais à un entretien d'embauche et on m'a demandé de donner une définition courte et claire du polymorphisme. Parce que je ne pouvais pas donner une définition claire et concise, j'ai commencé à y réfléchir et voici ma définition:

La capacité des objets d'un type à avoir une seule et même interface, mais une implémentation différente de cette interface.

14
Nikolay Traykov

Définition :

Le polymorphisme est un mot à 10 $ pour une idée à 1 $ - que lorsque je demande que quelque chose soit fait, je me fiche de la façon dont cela est réalisé tant que le résultat final est approprié. Tant que service est fourni correctement, je ne me soucie pas de implementation.

Discussion

Bien qu'il soit couramment utilisé dans le développement de logiciels, en particulier dans les systèmes développés suivant des principes orientés objet, le polymorphisme est fondamentalement un principe du monde réel et doit être défini en termes réels, et non technologiques.

Exemples

Lorsque je veux passer un appel téléphonique, je décroche un téléphone, compose un numéro et parle à la partie à l'autre bout. Peu m'importe qui a fabriqué le téléphone, quelle technologie il utilise, qu'il soit câblé, sans fil, mobile ou VoIP, ou qu'il soit sous garantie. 

Lorsque je veux imprimer un document, je l’imprime. Peu m'importe le langage d'implémentation, la marque de l'imprimante, le style de connexion, le choix du consommable ou la qualité du papier.

10
Bevan

Plusieurs implémentations de la même interface.

Exemple: De nombreux modèles de téléphone implémentent l'interface du clavier numérique.

10
Doug Knesek

Le polymorphisme est une stratégie orientée objet utilisée lors de la conception de modèles objet pour simplifier le code. À la base, le polymorphisme réside dans la possibilité de définir deux objets identiques mais différents, puis de traiter les deux objets comme s'ils étaient identiques.

Ok c'est dur ....

6
JoshBerke

Je pensais juste ajouter ma propre interprétation de ce qu'est le polymorphisme: Très génériquement, le polymorphisme est l'acte consistant à fournir un interface unique aux entités de différents types.

C’est plutôt générique, mais c’est la seule façon pour moi d’envelopper les trois types de polymorphismes que je connais: ad hoc, paramétrique et sous-type. Je donnerai plus de détails ci-dessous et je classerai les types de polymorphismes par nom, par ordre alphabétique. Celui qui vous intéresse est très probablement polymorphisme de sous-type}, qui est le dernier.

Polymorphisme ad hoc

(Polymorphisme ad hoc) consiste à fournir plusieurs implémentations de la même méthode pour différents types de paramètres. Dans OOP , il est généralement appelé surcharge de méthode. Par exemple:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

Les deux méthodes format partagent un interface unique, mais elles fonctionnent sur des entités de types différents.

Polymorphisme paramétrique

Polymorphisme paramétrique est l'acte de faire fonctionner une classe (ou une méthode) sur un type qui est lui-même un paramètre de la classe (ou méthode). On parle souvent de génériques.

Par exemple, le List[T] de Java attend un paramètre T au moment de l'instanciation et ce paramètre définit le type de l'objet résultant.

Notez pour les puristes que j’ignore délibérément types bruts car j’ai l’impression qu’ils brouilleraient les cartes dans ce contexte.

List[String] et List[Date] partagent un interface unique _, mais fonctionnent sur (et sont) différents types.

Polymorphisme de sous-type

(Polymorphisme de sous-type) est probablement ce que vous vouliez dire initialement dans votre question: c'est l'acte de fournir une interface unique à plusieurs implémentations du même type.

Pour utiliser l'exemple habituel: Animal fournit un contrat que toutes les implémentations doivent respecter. Dog est une Animal et, en tant que telle, prend en charge toutes les opérations déclarées par Animal. Selon le principe de substitution Liskov , cela vous permet d'utiliser une instance de Dog où une instance de Animal est attendue (mais pas l'inverse).

Si Cat et Dog sont tous les deux des sous-classes de Animal, ils partagent un interface unique _ mais sont en fait types différents_.

Je suis un peu tangent ici, mais le polymorphisme de sous-type est (je pense) le seul qui autorise substitution: l'acte de redéfinir le comportement d'une méthode définie par une classe parent. Ceci est souvent confondu avec surcharge qui, comme nous l'avons vu précédemment, est un type de polymorphisme et n'a pas besoin de sous-classes (ni de classes, en réalité).

6
Nicolas Rinaudo

polymorphisme == plusieurs classes + signatures de la même méthode + comportement spécifique à la classe.

5
S.Lott

Il semble que les meilleures définitions soient fournies ici, alors laissez-moi ajouter mon deux centimes s'il vous plaît, juste pour les autres observateurs. J'espère que cela pourrait aider davantage.

Il existe deux types de polymorphisme:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

Il s'agit simplement d'une surcharge de méthode et d'une surcharge d'opérateur

2.  Run time or (dynamic) polymorphism.

Le premier terme} _ est hérité des terminologies Java et C++.

Mais dans la terminologie .NET, seul le second one (je veux dire polymorphisme à l'exécution) est vraiment supposé être un polymorphisme et simplement appelé polymorphisme.

Et pour autant que je sache, il existe trois méthodes pour implémenter (exécution) polymorphism.

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Un exemple simple de polymorphisme basé sur une interface:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Sortie:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:
5
siamak

Le polymorphisme est une abstraction de codage logiciel dans laquelle plusieurs entités sous-jacentes différentes (généralement des données, mais toujours) partagent une interface commune qui leur permet de paraître et d’agir de manière identique à l’exécution. Nous l'utilisons comme technique de développement pour imposer un comportement cohérent sur une vaste gamme d'instances similaires, mais non identiques, avec une implémentation minimale absolue, réduisant ainsi l'attente de bogues et d'incohérences.

Paul. 

5
Paul W Homer

Le polymorphisme est une caractéristique des langages de programmation qui permet de traiter un objet comme une instance de son supertype.

2
TarkaDaal

Le polymorphisme est la capacité d'un objet à apparaître et à se comporter différemment pour la même invocation . Ex: chaque animal apparaît et sonne différemment (lorsque vous le frappez :))

2
Mallik

Plusieurs formes d'un même objet sont appelées polymorphisme.

2
milot

Le polymorphisme est une fonctionnalité de langage permettant à un code algorithmique de haut niveau de fonctionner sans modification sur plusieurs types de données. Et l'autre phrase, peu importe ce que c'était pour ... ;-P.

(Les types que C++ prend en charge sont énumérés et contrastés dans ma réponse: Polymorphisme en c ++ )

1
Tony Delroy

C'est la définition que j'ai toujours suivie:

Deux objets sont polymorphes (par rapport à un protocole particulier) entre eux, s'ils répondent tous deux aux mêmes messages avec la même sémantique.

Le polymorphisme concerne les messages, consiste à pouvoir répondre au même ensemble de messages avec la même sémantique.

Si deux objets peuvent répondre à vide? mais la sémantique du message est différente, alors… ils ne sont pas polymorphes.

1
Claudio Acciaresi

Polymorphisme

Différents objets peuvent répondre au même message de différentes manières et permettent aux objets d'interagir les uns avec les autres sans connaître leur type exact.

Via: http://www.agiledata.org/essays/objectOrientation101.html

1
Matt

Le polymorphisme est une fonctionnalité de programmation qui permet à un objet d'avoir plusieurs types ('formes') et vous permet de le traiter comme n'importe lequel de ces types en fonction de ce que vous devez faire sans connaître ni se soucier de ses autres types.

1
Jeff Sternal

Donner un nom unique à un ensemble d'opérations analogues sur différents types. Bien faite, l'analogie est évidente, par exemple. "ajoutant" des nombres de manière arithmétique et "ajoutant" des chaînes par concaténation (qui additionne leurs longueurs).

1
joel.neely

Le polymorphisme au niveau inférieur permet d'appeler des méthodes définies par les implémenteurs d'une interface à partir de l'instance d'interface.

1
Igor Zevaka

Le concept de polymorphisme est devenu un phénomène ces derniers temps. Voici la dérive réelle. Runtime définit quelle sous-méthode doit être invoquée par une référence d'une super classe. Maintenant, qu'est-ce que cela signifie dans la pratique? Cela ne signifie en réalité rien. Vous pouvez coder simplement sans polymorphisme. Alors pourquoi? Parce que, si nous n’avons pas le polymorphisme, nous devions mémoriser toutes les définitions de fonctions de sous-classe. Le polymorphisme nous en sauve en pratique.

Vous pouvez définir une liste comme suit:

List list = new List();

mais si vous recherchez IList, vous pouvez bénéficier de l'interface en tant que:

IList list = new List();

et utilisez librement la référence IList. En supposant que IList soit également implémenté dans une autre classe, vous pouvez utiliser les méthodes de cette classe inconnue via à nouveau la référence IList sans essayer de vous souvenir de ce nom de classe. Merveilleux, n'est-ce pas?

Maintenant, des informations plus précieuses sont à venir:
Java est polymorphe par défaut, alors que .NET et C++ ne le sont pas. Sous MS, vous devez déclarer la fonction de base virtual (et dans le mot clé .NET override).

En outre, il existe 2 règles intégrales dans le polymorphisme. L’un est l’héritage (via une interface ou via une extension de classe) et l’autre est primordial. Sans passer outre, le polymorphisme n'existe pas. Notez que la surcharge de méthodes (qui se trouve toujours dans une seule classe) est également un type de polymorphisme "minimaliste".

0
jazziiilove

Le polymorphisme est la capacité d'utiliser différentes classes qui implémentent une interface commune (ou étendent une classe de base commune) de manière commune, sans avoir besoin maintenant d'une implémentation spécifique et en utilisant uniquement les méthodes disponibles dans l'interface commune.

Par exemple, en Java, lorsque ArrayList et LinkedList implémentent List, si vous déclarez une variable en tant que List, vous pouvez toujours effectuer les opérations autorisées dans List, peu importe si votre variable était instanciée en tant que ArrayList ou LinkedList. 

0
GaRRaPeTa

Je pense que l'implémentation de méthodes de la même signature dans différentes classes (avoir une sorte de relation d'héritage en utilisant des rallonges ou des implémentations) est une méthode primordiale ainsi qu'un polymorphisme car nous obtenons ainsi de nombreuses formes de la même signature de méthode.

0
anand

Pour une signature de méthode donnée, différentes implémentations de méthode sont exécutées pour différentes classes, liées de manière hiérarchique.

0
Paolo

Les entités du même type (c'est-à-dire qui implémentent la même interface ou qui dérivent de la même classe) se comportent de différentes manières (sous le même nom de méthode).

0
paul paul