web-dev-qa-db-fra.com

Exemple pratique de polymorphisme

Quelqu'un peut-il me donner un exemple concret et concret de polymorphisme? Mon professeur me raconte la même vieille histoire que j'ai toujours entendue au sujet du + opérateur. a+b = c et 2+2 = 4, c'est donc du polymorphisme. Je ne peux vraiment pas m'associer à une telle définition, car j'ai lu et relu cela dans de nombreux livres.

Ce dont j'ai besoin, c'est d'un exemple du monde réel avec du code, quelque chose que je peux vraiment associer.

Par exemple, voici un petit exemple, juste au cas où vous voudriez l'étendre.

>>> class Person(object):
    def __init__(self, name):
        self.name = name

>>> class Student(Person):
    def __init__(self, name, age):
        super(Student, self).__init__(name)
        self.age = age
56
Maxx

Consultez l'exemple Wikipedia: il est très utile à un niveau élevé:

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'),
           Cat('Mr. Mistoffelees'),
           Dog('Lassie')]

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

# prints the following:
#
# Missy: Meow!
# Mr. Mistoffelees: Meow!
# Lassie: Woof! Woof!

Remarquez ce qui suit: tous les animaux "parlent", mais ils parlent différemment. Le comportement "parler" est donc polymorphe en ce sens qu'il est réalisé différemment selon l'animal. Ainsi, le concept abstrait "animal" ne "parle" pas réellement, mais des animaux spécifiques (comme les chiens et les chats) ont une mise en œuvre concrète de l'action "parler".

De même, l'opération "ajouter" est définie dans de nombreuses entités mathématiques, mais dans certains cas, vous "ajoutez" selon des règles spécifiques: 1 + 1 = 2, mais (1 + 2i) + (2-9i) = (3-7i ).

Le comportement polymorphe vous permet de spécifier des méthodes courantes à un niveau "abstrait" et de les implémenter dans des cas particuliers.

Pour votre exemple:

class Person(object):
    def pay_bill(self):
        raise NotImplementedError

class Millionare(Person):
    def pay_bill(self):
        print "Here you go! Keep the change!"

class GradStudent(Person):
    def pay_bill(self):
        print "Can I owe you ten bucks or do the dishes?"

Vous voyez, les millionnaires et les étudiants diplômés sont tous deux des personnes. Mais quand il s'agit de payer une facture, leur action spécifique "payer la facture" est différente.

161
Escualo

Un exemple réel courant dans Python est objets de type fichier . Outre les fichiers réels, plusieurs autres types, y compris StringIO et BytesIO , sont de type fichier. Une méthode qui agit comme des fichiers peut également agir sur eux car ils prennent en charge les méthodes requises (par exemple read, write).

10
Matthew Flaschen

Un exemple C++ de polymorphisme de la réponse ci-dessus serait:

class Animal {
public:
  Animal(const std::string& name) : name_(name) {}
  virtual ~Animal() {}

  virtual std::string talk() = 0;
  std::string name_;
};

class Dog : public Animal {
public:
  virtual std::string talk() { return "woof!"; }
};  

class Cat : public Animal {
public:
  virtual std::string talk() { return "meow!"; }
};  

void main() {

  Cat c("Miffy");
  Dog d("Spot");

  // This shows typical inheritance and basic polymorphism, as the objects are typed by definition and cannot change types at runtime. 
  printf("%s says %s\n", c.name_.c_str(), c.talk().c_str());
  printf("%s says %s\n", d.name_.c_str(), d.talk().c_str());

  Animal* c2 = new Cat("Miffy"); // polymorph this animal pointer into a cat!
  Animal* d2 = new Dog("Spot");  // or a dog!

  // This shows full polymorphism as the types are only known at runtime,
  //   and the execution of the "talk" function has to be determined by
  //   the runtime type, not by the type definition, and can actually change 
  //   depending on runtime factors (user choice, for example).
  printf("%s says %s\n", c2->name_.c_str(), c2->talk().c_str());
  printf("%s says %s\n", d2->name_.c_str(), d2->talk().c_str());

  // This will not compile as Animal cannot be instanced with an undefined function
  Animal c;
  Animal* c = new Animal("amby");

  // This is fine, however
  Animal* a;  // hasn't been polymorphed yet, so okay.

}
6
Kyuubi Kitsune