Подтвердить что ты не робот

В чем разница между полиморфизмом и утиным типом?

Я немного смущен этими двумя терминами, вот что я знаю:

Полиморфизм - это способность объекта разных типов обрабатываться общим интерфейсом. В то время как утиная печать, это своего рода динамическая типизация, которая позволяет объектам разных типов реагировать на одни и те же методы.

Из того, что я понимаю, полиморфизм больше связан с созданием интерфейса, который может использоваться для разных классов. И утка набирает информацию о свободной печати, которая позволит вызывать методы до тех пор, пока они будут найдены в получателе сообщения.

Это правильно? Я довольно запутался в этих двух, они кажутся связанными, но я не знаю, каковы их отношения. Большое спасибо заранее!

4b9b3361

Ответ 1

Полиморфизм (в контексте объектно-ориентированного программирования) означает, что подкласс может переопределить метод базового класса. Это означает, что метод класса может делать разные вещи в подклассах. Например: класс Animal может иметь метод talk(), а подклассы Dog и Cat of Animal могут позволить методу talk() создавать разные звуки.

Duck typing означает, что код просто примет любой объект, который имеет конкретный метод. Скажем, у нас есть следующий код: animal.quack(). Если данный объект Animal имеет метод, который мы хотим назвать, тогда мы хороши (никаких дополнительных требований к типу не требуется). Не имеет значения, действительно ли Animal a Duck или другое животное, которое также случается с шарлатаном. Вот почему он называется утиным типом: если он выглядит как утка (например, он имеет метод под названием quack(), тогда мы можем действовать так, как будто этот объект является утиной).

Так связаны ли они? Это просто отдельные функции, которые могут иметь языки программирования. Существуют языки программирования, которые имеют полиморфизм, но у которых нет утиного набора текста (например, Java). Существуют также языки, которые имеют полиморфизм и утиную типизацию (например, Python).

Ответ 2

Это пример полиморфизма в Python.

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
    print animal.name + ': ' + animal.talk()

Это пример для утиного ввода в Python.

class Duck:
    def quack(self):
        print("Quaaaaaack!")
    def feathers(self):
        print("The duck has white and gray feathers.")
    def name(self):
        print("ITS A DUCK NO NAME")


class Person:
    def quack(self):
        print("The person imitates a duck.")
    def feathers(self):
        print("The person takes a feather from the ground and shows it.")
    def name(self):
        print("John Smith")

def in_the_forest(duck):
    duck.quack()
    duck.feathers()
    duck.name()

def game():
    for element in [ Duck() , Person()]:
        in_the_forest(element)

game()
  • В полиморфизме мы видим подкласс (Cat и Dog), наследующий от родительского класса (Animal) и переопределяющий метод Talk.
  • В случае утиного ввода мы не создаем подкласс, а новый класс создается с использованием метода с тем же именем, но с другой функцией.

Ответ 3

Полиморфизм двух типов

  • Перегрузка метода (Полиморфизм времени компиляции).
  • Переопределение метода (полиморфизм времени выполнения).

Перегрузка метода: - такое же имя функции и другой тип данных известно как перегрузка метода

Пример:

  int addTwovalues(int a, int b)
  { return (a+b)}

  float addTwovalues(float a, float b)
  { return (a+b)}

  Method overriding :- same function name and same data type but different Class
     is known as       Method overriding.


  class a
 {
  virtual int addtwovalues()
   {  // to do  }
  }
 class b:a
 {
     override int addtwovalues()
   {  // to do  }

  }



  a obj=new a();
  obj.addtwovalues();

  b objb=new a();
  objb.addtwovalues();  //run time Polymorphism