Polymorphisme - Définir en deux phrases seulement [fermé]


85

J'ai regardé d'autres définitions et explications et aucune d'entre elles ne me satisfait. Je veux voir si quelqu'un peut définir le polymorphisme en au plus deux phrases sans utiliser de code ou d'exemples. Je ne veux pas entendre «donc vous avez une personne / une voiture / un ouvre-boîte ...» ou comment le mot est dérivé (personne n'est impressionné que vous sachiez ce que signifient poly et morph). Si vous avez une très bonne compréhension de ce qu'est le polymorphisme et une bonne maîtrise de l'anglais, vous devriez être en mesure de répondre à cette question dans une définition courte, quoique dense. Si votre définition définit avec précision le polymorphisme mais est si dense qu'elle nécessite quelques lectures, alors 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 écrasement vs surcharge
Essayez de décrire le polymorphisme aussi facilement que possible

Pourquoi est-ce que je pose cette question? Parce qu'on m'a posé la même question et que j'ai constaté que j'étais incapable de trouver 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 faire l'exigence de deux phrases (c'est un sujet difficile à définir), alors c'est bien si vous y allez. 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 ou comment l'utiliser (faire la différence?).


Un nom, plusieurs implémentations.
Prosunjit Biswas

2
J'ai posé cette question lors d'un entretien d'embauche. Je sentais que le poser lors d'un entretien d'embauche était un acte de snobisme élitiste, le genre de chose qu'un employé de Google demanderait avec suffisance en supposant que personne ne pouvait y répondre efficacement. Si vous n'avez pas obtenu le poste parce que vous ne pouviez pas répondre, vous feriez probablement mieux de travailler pour des personnes qui sont plus intéressées par ce que vous pouvez faire que par celles que vous pouvez déjouer.
MagicLAMP

Le polymorphisme est un concept très important à comprendre dans le développement. Je recommande vivement au moins de comprendre sa valeur si ce n'est la définition formelle. Je suggère de pouvoir au moins expliquer le fonctionnement du modèle de stratégie et sa valeur.
Chad Johnson

Réponses:


106

Le polymorphisme permet l'expression d'une sorte de contrat, avec potentiellement de nombreux types implémentant ce contrat (que ce soit par héritage de classe ou non) de différentes manières, chacune selon son propre objectif. Le code utilisant ce contrat ne devrait pas (*) avoir à se soucier de l'implémentation impliquée, seulement que le contrat sera respecté.

(*) Dans le cas idéal, en tout cas - évidemment, bien souvent, le code appelant a choisi très délibérément l'implémentation appropriée!


1
Mark, avez-vous à un moment donné accepté cette réponse et l'avez-vous rejetée? J'essaie de trouver ce qui ressemble à un bogue dans le système de réputation - cette réponse m'a donné un net de -15 représentants pour aujourd'hui, assez étrangement.
Jon Skeet

Pareil ici, Jon - j'ai maintenant 2 réponses acceptées avec -15 rep. Pas que je m'en soucie mais c'est intrigant.
Otávio Décio

3
À proprement parler, rien n’exige qu ’« un type exprime une sorte de contrat ». Tout ce qui est vraiment nécessaire est que plusieurs implémentations puissent répondre au même message sans que l'expéditeur du message ait besoin de savoir ou de se soucier de l'implémentation qui gère le message.
Doug Knesek

3
@Doug: S'il n'y a pas de contrat, même implicite dans la documentation ou la dénomination, alors comment savez-vous que cela va faire ce que vous voulez? Vous parlez d'une «interface» dans votre propre réponse - ce qui me ressemble beaucoup à un contrat - quelle est selon vous la différence? «Interface» et «contrat» sont des mots qui peuvent être utilisés dans un sens «fort» (par exemple appliqué au moment de la compilation) ou de manière très lâche (par exemple par convention de dénomination et utilisation de typage dynamique).
Jon Skeet

1
@Alex: Oui, ce serait une modification que je reviendrais - je préfère ma formulation. Cependant, vous pouvez toujours ajouter votre propre réponse.
Jon Skeet

72

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 (car c'est un fruit). Une banane peut aussi être consommée (car c'est aussi un fruit), mais d'une manière différente d'une pomme. Vous l'épluchez d'abord.

Eh bien, au moins je le fais, mais je suis bizarre à certains égards alors que sais-je.

Cela illustre l'héritage (les fruits peuvent être consommés), le polymorphisme (quelque chose qui mange des fruits peut manger tous les types de fruits) et l'encapsulation (une banane a une peau).

Sérieusement, l'héritage d'objets, le polymorphisme, l'encapsulation, les choses virtuelles, les choses abstraites, les choses privées, les choses publiques, ce sont tous des concepts difficiles. Si quelqu'un veut absolument avoir une définition en 2 phrases de ceci, veuillez marquer la question comme une variante de code-golf, car deux de ces phrases devront être si concises qu'à moins que vous ne sachiez déjà ce que c'est, vous n'en saurez pas assez. pour savoir sur quoi vous devez en savoir plus.


lassevk: "à moins que vous ne sachiez déjà ce que c'est, vous n'en saurez pas assez pour savoir sur quoi vous devez en savoir plus" << Juste pour clarifier, c'est ce que j'attends. Je cherche une définition qui peut demander un peu de réflexion. Pas celui qui serait utilisé pour enseigner à un débutant.
Mark Testa

2
J'ai compris cela, je viens de publier une réponse un peu humoristique (pour moi en tout cas) :) Le polymorphisme et la POO sont l'un de ces gros murs, où si vous tracez la courbe d'apprentissage, vous frappez simplement un grand mur et soit vous rampez dessus ou vous ne le faites pas. Si vous le faites, vous avez généralement un gros AHA! experience ...
Lasse V. Karlsen

8
La pruche est aussi un fruit! Vous ne pouvez le manger qu'une seule fois!
James Anderson

@JamesAnderson Alors, un singleton?
Lasse V. Karlsen

47

Le polymorphisme déclare 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.


C'est incroyablement succinct et je pense que ça va parfaitement
Alex W

21

Wikipedia: Le polymorphisme est une fonctionnalité du 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.


21

En fait, il existe de multiples formes de polymorphisme et il y a une certaine controverse à ce sujet; vous pouvez même voir des professeurs de CS qui ne peuvent pas le définir correctement. Je connais 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 (le vecteur de int et le vecteur de chaîne ont tous 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 (ie Triangle est une forme).


2
+1 pour avoir mentionné qu'il existe différents types de polymorphisme. Cependant, votre définition du polymorphisme ad hoc semble être assez différente de celle mentionnée sur en.wikipedia.org/wiki/Type_polymorphism . Cette page indique qu'il existe 2 types (ad-hoc ou paramétrique), pas 3, et fait également une distinction entre les fonctions polymorphes et les types de données polymorphes. Vos 3 types, pour autant que je sache, correspondent respectivement aux fonctions polymorphes paramétriques, aux types de données polymorphes paramétriques et aux fonctions polymorphes ad hoc.
Laurence Gonsalves

salut, quelle est la différence entre "instance d'un type générique" et "hérite d'un autre type", cela semble dire la même chose?
Shanimal

@LaurenceGonsalves fwiw, le lien fourni dans le premier commentaire pointe vers trois types. Le polymorphisme paramétrique est défini comme permettant l'écriture «générique» d'une fonction ou d'un type de données.
Shanimal

14

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 de définition claire et courte, j'ai commencé à y penser 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.


10

Définition :

Le polymorphisme est un mot à 10 $ pour une idée à 1 $ - que lorsque je demande quelque chose à faire, je me fiche de la façon dont cela est réalisé tant que le résultat final est approprié. Tant que le service est fourni correctement, je me fiche de l' implémentation .

Discussion

Bien qu'il soit couramment utilisé dans le développement de logiciels, en particulier dans les systèmes développés selon des principes orientés objet, le polymorphisme est fondamentalement un principe du monde réel et devrait être défini en termes du monde réel, pas en termes 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 personne à l'autre bout du fil. Peu m'importe qui a fabriqué le téléphone, quelle technologie il utilise, qu'il soit filaire, sans fil, mobile ou VOIP, ou s'il est sous garantie.

Lorsque je veux imprimer un document, je l'imprime. Je me fiche du langage d'implémentation, de la marque d'imprimante, du style de connexion, du choix du consommable ou de la qualité du papier.


5
sonne comme un exemple Encapsulationpour moi
Singleton

1
Le polymorphisme, l'encapsulation et l'abstraction sont tous assez étroitement liés, bien qu'ils se concentrent sur des perspectives différentes. De bonnes abstractions facilitent la réalisation du polymorphisme, et une bonne encapsulation aide à empêcher les détails de «fuir».
Bevan

10

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.


8

Le polymorphisme est une stratégie orientée objet utilisée lors de la conception de modèles d'objet, pour aider à simplifier le code. Au cœur du polymorphisme se trouve la capacité de définir deux objets similaires mais différents, puis de traiter les deux objets comme s'ils étaient identiques.

Ok c'est difficile ...


7

J'ai juste pensé ajouter ma propre interprétation de ce qu'est le polymorphisme: de manière très générique, le polymorphisme est l'acte de fournir une interface unique à des entités de différents types .

C'est plutôt générique, mais c'est la seule façon dont je peux penser pour envelopper les trois types de polymorphismes que je connais: ad hoc , paramétrique et sous - type . J'irai plus en détail ci-dessous et j'ai trié les types de polymorphisme par nom, par ordre alphabétique. Celui qui vous intéresse est probablement le polymorphisme de sous-type , qui est le dernier.

Polymorphisme ad hoc

Le polymorphisme ad hoc consiste à fournir plusieurs implémentations de la même méthode pour différents types de paramètres. En POO , on parle généralement de 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 formatméthodes partagent une seule interface , mais elles fonctionnent sur des entités de types différents .

Polymorphisme paramétrique

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

Par exemple, Java List[T]attend un paramètre Tau 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 les types bruts car je pense qu'ils ne feraient que brouiller les eaux dans ce contexte.

List[String]et List[Date]partagez une seule interface , mais travaillez sur (et sont) différents types .

Polymorphisme de sous-type

Le polymorphisme de sous-type est probablement ce que vous vouliez dire au départ dans votre question: c'est l'acte de fournir une interface unique à plusieurs implémentations du même type.

Pour utiliser l'exemple habituel: Animalfournit un contrat que toutes les implémentations doivent respecter. Dogest un Animal, et en tant que tel prend en charge toutes les opérations qui Animaldéclarent. Selon le principe de substitution de Liskov , cela vous permet d'utiliser une instance Dogoù une instance de Animalest attendue (mais pas l'inverse).

Si Catet Dogsont deux sous-classes de Animal, alors ils partagent une seule interface mais sont en fait de types différents .

Je pars un peu dans une tangente ici, mais le polymorphisme de sous-type est (je pense) le seul qui permet de redéfinir : l'acte de redéfinir le comportement d'une méthode définie par une classe parente. Ceci est souvent confondu avec la surcharge qui, comme nous l'avons vu précédemment, est un type de polymorphisme et n'a en fait pas besoin de sous-classification (ni de classes, vraiment).


alors qu'en est-il du polymorphisme basé sur l'interface?
siamak

@siamak n'est-ce pas simplement un type spécifique de polymorphisme de sous-type où le type parent est entièrement abstrait? Ou voulez-vous dire autre chose?
Nicolas Rinaudo

Mon intention d'interface est Interface en tant que type de référence qui existe dans les langages orientés objet, comme ceci: Interface I1 {void M ();} Je crois qu'il y a tellement de différences entre le sous-type ou le polymorphisme basé sur l'héritage et le polymorphisme basé sur l'interface . Parce qu'il y a une relation «Est-un» dans le polymorphisme basé sur l'héritage entre les types, mais il n'y a pas une telle chose dans le polymorphisme basé sur l'interface. En fait, un même comportement avec différentes implémentations pourrait être partagé entre différents types (classes)
siamak

Je dois admettre que je suis confus - mis à part votre approche quelque peu balistique du boîtier supérieur, il semble que votre description de ce que vous appelez le polymorphisme basé sur l'interface est exactement la même que ma description du polymorphisme de sous-type. Je suis sûr que vous voyez une différence, mais j'ai bien peur que ce ne soit vraiment pas clair pour moi.
Nicolas Rinaudo

Comme vous pouvez le voir, il n'y a pas de relation entre la voiture et l'oiseau et la personne, mais ils peuvent se déplacer à leur manière. Il y a une énorme différence entre la classe abstraite et l'interface et l'utilisation de l'interface n'est pas la même chose que le sous-typage, donc à mon avis, le polymorphisme d'héritage et le polymorphisme basé sur l'interface ne sont pas les mêmes choses et ne sont pas égaux. // c'est dur, codage dans le segment des commentaires //
siamak

6

Il semble que les meilleures définitions soient fournies ici, alors permettez-moi d'ajouter mes deux cents 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.

C'est simplement une surcharge de méthode et une surcharge d'opérateur

2.  Run time or (dynamic) polymorphism.

Le premier terme est hérité de la terminologie Java et C ++.

Mais dans la terminologie .NET, seul le second ( je veux dire le 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 le polymorphisme (à l' exécution ) .

 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 l'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();
    }
}

Production:

 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:

Je ne vois toujours pas la différence que tu fais. Person, Bird et Car sont tous des sous-types d'Imobile. La personne est une Imobile, l'oiseau est une Imobile et la voiture est une Imobile. Si vous deviez exiger une variable de type Imobile, vous pourriez utiliser une instance de Person, Bird ou Car, tous taperaient check. C'est précisément ce que signifie le polymorphisme de sous-type.
Nicolas Rinaudo

Bird et Person and Car ne sont pas des sous-types d'Imobile, ils sont des implémenteurs de cette interface et "réalisent" cette interface à leur manière, le terme de "sous-type" est largement utilisé entre un type réel et un sous-type réel qui en a hérité, et dans cette situation, il existe une relation «Is-a» entre eux, par exemple un chien est un sous-type de mammifère.
siamak du

du point de vue du compilateur, faire une référence à une interface et utiliser les références est quelque chose de vrai et correct. / MAIS / IT n'est pas un concept égal au sous-typage dans une relation d'héritage. Et je pense qu'appeler les implémenteurs d'une interface en tant que sous-types est tellement maladroit et vraiment faux.
siamak

Un exemple de polymorphisme basé sur l'héritage ferait bien d'expliquer cette réponse.
Marcelo Mason

5

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 toutes une interface commune qui leur permet de sembler et d'agir de la même manière lors de l'exécution. Nous l'utilisons comme technique de développement pour imposer un comportement cohérent sur un large éventail d'instances similaires, mais pas identiques, avec une implémentation minimale absolue, réduisant ainsi les attentes de bogues et d'incohérences.

Paul.


5

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


2

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



2

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

Le polymorphisme est une caractéristique des langages de programmation qui permet à un objet d'être traité comme une instance de son supertype.


Downvoter - Pouvez-vous expliquer pourquoi?
TarkaDaal

1

Donner un nom unique à un ensemble d'opérations analogues sur différents types. Lorsqu'elle est bien faite, l'analogie est évidente, par exemple "ajouter" des nombres arithmétiquement et "ajouter" des chaînes par concaténation (qui additionne leurs longueurs).


1

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

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

Le polymorphisme concerne les messages, il s'agit de 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

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


1

Le polymorphisme est une fonctionnalité de programmation qui permet à un objet d'avoir de nombreux types («formes») et vous permet de le traiter comme l'un de ces types en fonction de ce que vous devez faire sans connaître ou vous soucier de ses autres types.


1

Le polymorphisme est une fonctionnalité de langage permettant au code algorithmique de haut niveau de fonctionner sans changement sur plusieurs types de données. Et l'autre phrase, quelle qu'elle soit pour ... ;-P.

(Les types pris en charge par C ++ sont répertoriés et contrastés dans ma réponse: Polymorphisme en C ++ )


0

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, que signifie en pratique? Cela ne veut rien dire. 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 des fonctions de sous-classes. Le polymorphisme nous en sauve dans la pratique.

Vous pouvez définir une liste comme suit:

List list = new List();

mais si vous vérifiez IList, vous pouvez bénéficier de l'interface comme:

IList list = new List();

et utilisez la IListréférence librement. En supposant qu'elle IListsoit également implémentée dans une autre classe, vous pouvez utiliser des méthodes de cette classe inconnue via une nouvelle IListréférence sans essayer de vous souvenir de ce nom de classe. Merveilleux, n'est-ce pas?

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

En outre, il existe 2 règles intégrales dans le polymorphisme. L'un est l'héritage (via l'interface impl. Ou via l'extension de classe) et l'autre est le remplacement. Sans priorité, le polymorphisme n'existe pas. Notez que la surcharge de méthode (qui est toujours dans une seule classe) est également un type de polymorphisme «minimaliste».


1
Cela fait plus de 2 phrases.
Dangereux

0

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 hiérarchiquement.


0

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 de l'implémentation spécifique, et en utilisant uniquement les méthodes disponibles dans l'interface commune.

Ie: En Java, comme ArrayList et LinkedList implémentent tous les deux List, si vous déclarez une variable comme List, vous pouvez toujours effectuer les opérations autorisées dans List, peu importe si votre variable a été instanciée comme ArrayList ou LinkedList.


0

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


0

Je pense que la mise en œuvre de méthodes de la même signature dans différentes classes (ayant une sorte de relation d'héritage en utilisant des extensions ou des implements) est une substitution de méthode et également un polymorphisme car de cette manière nous obtenons de nombreuses formes de la même signature de méthode.


-2

Je suppose que parfois les objets sont appelés dynamiquement. Vous n'êtes pas sûr que l'objet soit un triangle, un carré, etc. dans un poly de forme classique. exemple.

Donc, pour laisser toutes ces choses derrière nous, nous appelons simplement la fonction de classe dérivée et supposons que celle de la classe dynamique sera appelée.

Vous ne vous soucieriez pas si c'est un carré, un triangle ou un rectangle. Vous vous souciez juste de la région. Par conséquent, la méthode getArea sera appelée en fonction de l'objet dynamique passé.


-2

Le polymorphisme est la capacité d'une fonction à s'adapter automatiquement pour accepter des données d'entrée de différents types de données. Vous pouvez "Ajouter" deux doubles "1.1" et "2.2" et obtenir "3.3" ou "Ajouter" deux chaînes "Stack" et "Overflow" et obtenir "StackOverflow".


Pourquoi quelqu'un a-t-il noté cela - c'est la «réponse littérale» de la page Web de National Instrument sur le polymorphisme !!!
J-Dizzle

-3

Le polymorphisme se produit lorsque différents objets répondent à la même méthode d'une manière différente. Par exemple, une voiture se déplace sur la route tandis qu'une personne marche sur la route. Ce sont deux objets qui répondent différemment à la même route.


En fait, le polymorphisme voit les instances de différentes classes comme un type commun, et a pu utiliser les méthodes déclarées dans ce type commun indépendamment de la façon dont les différentes classes implémentent ces méthodes.
GaRRaPeTa
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.