2010-09-16 50 views
48

Có ai vui lòng cho tôi một cuộc sống thực, ví dụ thực tế về đa hình? Giáo sư của tôi kể cho tôi nghe câu chuyện cũ mà tôi luôn nghe về nhà điều hành +. a+b = c2+2 = 4, vì vậy đây là tính đa hình. Tôi thực sự không thể kết hợp bản thân mình với một định nghĩa như vậy, vì tôi đã đọc và đọc lại nó trong nhiều cuốn sách.Ví dụ thực tế về đa hình

Điều tôi cần là một ví dụ về thế giới thực với mã, điều mà tôi thực sự có thể liên kết.

Ví dụ, đây là một ví dụ nhỏ, chỉ trong trường hợp bạn muốn mở rộng nó.

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

Bạn đặc biệt yêu cầu về điều hành đa hình (còn gọi là toán tử quá tải), hoặc [polymorphism] (http://en.wikipedia.org/wiki/Type_polymorphism) nói chung? –

+0

Đa hình nói chung. – Maxx

Trả lời

146

Kiểm tra ví dụ Wikipedia: nó là rất hữu ích ở mức cao:

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! 

Thông báo như sau: tất cả các loài động vật "nói chuyện", nhưng họ nói cách khác nhau. Hành vi "nói chuyện" như vậy là đa hình theo nghĩa là nhận ra khác nhau tùy thuộc vào động vật. Vì vậy, khái niệm "động vật" trừu tượng không thực sự "nói chuyện", nhưng động vật cụ thể (như chó và mèo) có một thực hiện cụ thể của hành động "nói chuyện".

Tương tự, thao tác "thêm" được xác định trong nhiều thực thể toán học, nhưng trong trường hợp cụ thể bạn "thêm" theo quy tắc cụ thể: 1 + 1 = 2, nhưng (1 + 2i) + (2-9i) = (3-7i)

Hành vi đa hình cho phép bạn chỉ định các phương thức phổ biến ở cấp "trừu tượng" và triển khai chúng trong các trường hợp cụ thể.

Ví dụ của bạn:

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

Bạn thấy đấy, millionares và sinh viên grad đều là người. Nhưng khi nói đến việc thanh toán hóa đơn, hành động "thanh toán hóa đơn" cụ thể của họ là khác nhau.

+1

có phương thức 'abstract' tăng' NotImplementedError' ngắt 'super'. – aaronasterling

+1

Điều này khác với thừa kế như thế nào, theo đó các lớp con ghi đè các phương thức trong lớp cha? – Pyderman

+1

@ Thừa kế kế thừa là một trong ** phương tiện ** để đạt được đa hình. – Escualo

10

Ví dụ thực tế phổ biến trong Python là file-like objects. Bên cạnh tệp thực, một số loại khác, bao gồm StringIOBytesIO, giống như tệp. Phương thức hoạt động dưới dạng tệp cũng có thể tác động lên chúng vì chúng hỗ trợ các phương thức được yêu cầu (ví dụ: read, write).

5

Một C++ ví dụ về đa hình từ câu trả lời ở trên sẽ là:

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. 

} 
Các vấn đề liên quan