59 votes

Essayez de décrire le polymorphisme aussi facilement que possible

nous pouvons trouver beaucoup d'informations sur le sujet sur Internet et des livres

http://en.wikipedia.org/wiki/Type_polymorphism

mais essayons de le rendre aussi simple que possible.

69voto

Steven A. Lowe Points 40596

deux objets répondent au même message avec des comportements différents; l'expéditeur n'a pas à se soucier

32voto

David Frenkel Points 860

Tout est possible avec un simple pop couvercle s'ouvre de la même manière.
Comme un homme, vous savez que vous pouvez Ouvrir() pouvez-vous trouver.

Lorsqu'il est ouvert, pas tous les canettes se comportent de la même manière.
Certains contiennent des noix, certains contiennent de faux serpents qui sort de la pop.
Le résultat dépend du TYPE de la can, si la boîte était un "CanOfNuts" ou un "CanOfSnakes", mais cela n'a aucune influence sur la FAÇON dont vous l'ouvrez. Vous savez que vous pouvez ouvrir n'importe quel Peut et doit obtenir une sorte de suite qui est décidé en fonction du type de la can, il a été ouvert.

pUnlabledCan->Open(); //peut donner des noix, pourrait donner des serpents. Nous ne savons pas jusqu'à ce que nous appelons

Open() a un générique de type de retour de "Contenu" (ou nous pourrions décider pas de type de retour), ainsi que de l'ouvrir a toujours la même fonction de signature.

Vous, les humains, sont à l'utilisateur/de l'appelant.
Open() est le virtuel/fonction polymorphe.
"Peut" est la classe de base abstraite.
CanOfNuts et CanOfSnakes sont polymorphes enfants de la classe.
Chaque boîte peut être ouverte, mais que il ne et quels tye de contenu , il renvoie sont définis par ce genre de peut il est.
Tout ce que vous savez quand vous voyez pUnlabledCan est que vous pouvez l'Ouvrir (), et il sera de retour le contenu. Tout autre comportement (telles que l'affichage des serpents dans votre visage) sont décidés par le Peut.

31voto

Mark A. Nicolosi Points 11859

Ceci est tiré de ma réponse d'une question similaire. Voici un exemple de polymorphisme en pseudo-C # / Java:

 class Animal
{
    abstract string MakeNoise ();
}

class Cat : Animal {
    string MakeNoise () {
        return "Meow";
    }
}

class Dog : Animal {
    string MakeNoise () {
        return "Bark";
    }
}

Main () {
   Animal animal = Zoo.GetAnimal ();
   Console.WriteLine (animal.MakeNoise ());
}
 

La méthode Main () ne connaît pas le type de l'animal et dépend du comportement de la méthode MakeNoise () dans une implémentation particulière.

20voto

Greg Beech Points 55270

La description la plus simple de polymorphisme, c'est que c'est une façon de réduire si/instructions de commutation.

Il a également l'avantage de vous permettre d'étendre votre si/instructions de commutation (ou autres) sans modifier les classes existantes.

Par exemple, considérons l' Stream classe .NET. Sans polymorphisme ce serait un seul massive de la classe où chaque méthode met en œuvre une instruction switch quelque chose comme:

public class Stream
{
    public int Read(byte[] buffer, int offset, int count)
    {
        if (this.mode == "file")
        {
            // behave like a file stream
        }
        else if (this.mode == "network")
        {
            // behave like a network stream
        }
        else // etc.
    }
}

Au lieu de nous permettre l'exécution pour faire la commutation pour nous d'une façon plus efficace, en choisissant automatiquement la mise en œuvre, basé sur le type de béton (FileStream, NetworkStream), par ex.

public class FileStream : Stream
{
    public override int Read(byte[] buffer, int offset, int count)
    {
        // behave like a file stream
    }
}

public class NetworkStream : Stream
{
    public override int Read(byte[] buffer, int offset, int count)
    {
        // behave like a network stream
    }
}

10voto

Poly: beaucoup
Morphisme: formes / formes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X