2010-09-16 8 views
48

Kann mir bitte jemand ein wirkliches, praktisches Beispiel für Polymorphie geben? Mein Professor erzählt mir die gleiche alte Geschichte, die ich immer über den Operator + gehört habe. a+b = c und 2+2 = 4, so ist dies Polymorphismus. Ich kann mich wirklich nicht mit einer solchen Definition verbinden, da ich das in vielen Büchern gelesen und neu gelesen habe.Praktisches Beispiel für Polymorphie

Was ich brauche, ist ein Beispiel aus der realen Welt mit Code, etwas, mit dem ich wirklich assoziieren kann.

Zum Beispiel ist hier ein kleines Beispiel, nur für den Fall, dass Sie es erweitern möchten.

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

Sind Sie speziell über Operator Polymorphismus fragen (auch Überladen von Operatoren genannt) oder [Polymorphismus] (http://en.wikipedia.org/wiki/Type_polymorphism) im Allgemeinen? –

+0

Polymorphismus im Allgemeinen. – Maxx

Antwort

146

Überprüfen Sie die Wikipedia Beispiel: Es ist sehr hilfreich, auf hohem Niveau:

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! 

Beachten Sie die folgenden: alle Tiere „sprechen“, aber sie sprechen anders. Das "Sprechverhalten" ist somit in dem Sinne polymorph, dass es je nach Tier unterschiedlich umgesetzt wird. Das abstrakte "Tier" -Konzept "redet" also nicht, aber bestimmte Tiere (wie Hunde und Katzen) haben eine konkrete Umsetzung der Aktion "Talk".

Ähnlich ist die Operation "add" in vielen mathematischen Entitäten definiert, aber in bestimmten Fällen "addieren" Sie nach bestimmten Regeln: 1 + 1 = 2, aber (1 + 2i) + (2-9i) = (3-7i).

Mit dem polymorphen Verhalten können Sie allgemeine Methoden auf einer "abstrakten" Ebene angeben und sie in bestimmten Fällen implementieren.

Für Ihr Beispiel:

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?" 

Sie sehen, millionares und grade Studenten sind beide Personen. Aber wenn es darum geht, eine Rechnung zu bezahlen, ist ihre spezifische "Zahlung der Rechnung" -Aktion anders.

+1

mit einer 'abstrakten' Methode raise' NotImplementedError' bricht 'super' ab. – aaronasterling

+1

Wie unterscheidet sich das von der Vererbung, wobei Unterklassen Methoden in der Elternklasse überschreiben? – Pyderman

+1

@Pyderman Vererbung ist eines der ** Mittel **, um Polymorphie zu erreichen. – Escualo

10

Ein gängiges reales Beispiel in Python ist file-like objects. Neben den eigentlichen Dateien sind verschiedene andere Typen, einschließlich StringIO und BytesIO, dateiähnlich. Eine Methode, die als Datei fungiert, kann auch auf sie einwirken, da sie die erforderlichen Methoden unterstützt (z. B. read, write).

5

Ein C++ Beispiel für Polymorphismus aus der obigen Antwort wäre:

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. 

} 
Verwandte Themen