Практический пример полиморфизма
может ли кто-нибудь дать мне реальную жизнь, практический пример полиморфизма? Мой профессор рассказывает мне ту же старую историю, которую я всегда слышал о + оператора. a+b = c и 2+2 = 4, Так что это полиморфизм. Я действительно не могу связать себя с таким определением, поскольку я читал и перечитывал это во многих книгах.
что мне нужно, так это реальный пример с кодом, то, с чем я действительно могу ассоциироваться.
например, вот небольшой пример, просто в случае, если вы хотите продлить его.
>>> 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
3 ответов:
Проверьте пример Википедии: это очень полезно на высоком уровне:
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!обратите внимание на следующее: Все животные "говорят", но говорят по-разному. Таким образом, поведение" разговора " полиморфно в том смысле, что оно реализована по-разному в зависимости от животного. Таким образом, абстрактное понятие "животное" на самом деле не "говорит", но конкретные животные (например, собаки и кошки) имеют конкретную реализацию действия "говорить".
аналогично "добавить" операция определяется во многих математических сущностях, но в частных случаях вы "добавляете" по определенным правилам: 1+1 = 2, но (1+2i)+(2-9i)=(3-7i).
полиморфное поведение позволяет указать общие методы на "абстрактном" уровне и реализовать их в конкретных экземплярах.
для примера:
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?"видите ли, миллионеры и аспиранты-это люди. Но когда дело доходит до оплаты счета, их конкретное действие " оплатить счет отличающийся.
распространенным реальным примером в Python является объекты. Помимо собственно файлов, несколько других типов, в том числе StringIO и BytesIO, являются файл-как. Метод, который действует как файлы, также может действовать на них, потому что они поддерживают необходимые методы (например,
read,write).
пример полиморфизма C++ из приведенного выше ответа будет:
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. }
Comments