2010-09-16 30 views
48

¿Puede alguien darme por favor un ejemplo práctico de polimorfismo en la vida real? Mi profesor me cuenta la misma vieja historia que he escuchado siempre sobre el operador +. a+b = c y 2+2 = 4, entonces esto es polimorfismo. Realmente no puedo asociarme a esa definición, ya que la he leído y releído en muchos libros.Ejemplo práctico de polimorfismo

Lo que necesito es un ejemplo del mundo real con código, algo con lo que realmente puedo asociarme.

Por ejemplo, aquí hay un pequeño ejemplo, en caso de que quiera extenderlo.

>>> 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 
+0

¿Usted está pidiendo específicamente sobre el polimorfismo del operador (también llamada sobrecarga de operadores), o [polimorfismo] (http://en.wikipedia.org/wiki/Type_polymorphism) en general? –

+0

Polimorfismo en general. – Maxx

Respuesta

146

Comprobar el ejemplo Wikipedia: es muy útil en un nivel alto:

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! 

Aviso lo siguiente: todos los animales "hablar", pero hablan de manera diferente. El comportamiento de "hablar" es por lo tanto polimórfico en el sentido de que es realizado de manera diferente según el animal. Entonces, el concepto abstracto de "animal" en realidad no "habla", pero los animales específicos (como perros y gatos) tienen una implementación concreta de la acción "hablar".

De forma similar, la operación "agregar" se define en muchas entidades matemáticas, pero en casos particulares "agrega" según reglas específicas: 1 + 1 = 2, pero (1 + 2i) + (2-9i) = (3-7i).

El comportamiento polimórfico le permite especificar métodos comunes en un nivel "abstracto" e implementarlos en instancias particulares.

Para su ejemplo:

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

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

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

Ves, millionares y estudiantes graduados son ambas personas. Pero cuando se trata de pagar una factura, su acción específica de "pagar la factura" es diferente.

+1

que tiene un método 'abstracto' aumenta' NotImplementedError' rompe 'super'. – aaronasterling

+1

¿Cómo difiere esto de la herencia, por lo que las subclases anulan los métodos en la clase principal? – Pyderman

+1

@ La herencia Pdyderman es uno de los ** medios ** para lograr el polimorfismo. – Escualo

10

Un ejemplo real común en Python es file-like objects. Además de los archivos reales, varios otros tipos, incluidos StringIO y BytesIO, son similares a los archivos. Un método que actúa como archivos también puede actuar sobre ellos porque son compatibles con los métodos necesarios (por ejemplo, read, write).

ejemplo
5

A C++ del polimorfismo de la respuesta anterior sería:

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. 

}