Практический пример полиморфизма - PullRequest
56 голосов
/ 16 сентября 2010

Может ли кто-нибудь дать мне реальный пример практического использования полиморфизма? Мой профессор рассказывает мне ту же старую историю, которую я всегда слышал об операторе +. 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 ]

160 голосов
/ 16 сентября 2010

Посмотрите пример из Википедии: это очень полезно на высоком уровне:

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

Видите ли, миллионеры и аспиранты - оба люди. Но когда дело доходит до оплаты счета, их конкретное действие «оплатить счет» отличается.

10 голосов
/ 16 сентября 2010

Распространенный реальный пример в Python - файловые объекты . Помимо реальных файлов, некоторые другие типы, включая StringIO и BytesIO , похожи на файлы. Метод, который действует как файл, может также воздействовать на них, поскольку он поддерживает необходимые методы (например, read, write).

6 голосов
/ 01 декабря 2014

Примером полиморфизма 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.

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...