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

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

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

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

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

4 ответов


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

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

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


Это пример полиморфизма в 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.
  • в случае duck typing мы не создаем подкласс, вместо этого создается новый класс с методом, имеющим то же имя, но другую функцию.

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

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

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

пример :

  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 

Короткий Ответ:

Duck typing-один из способов достижения полиморфизма. Другой способ - использовать статическую типизацию.

Ответ:

здесь задействованы две разные концепции: техника набора текста и программирования.

Duck typing-это тип набора текста. А печатать означает , когда чтобы бросить ошибку, когда объект передан вокруг не то, что ожидается. Duck typing-это своего рода набор текста, где он бросает ошибка при запуске программы и вызове метода недоступна. Статическая типизация происходит во время проверки, поэтому если информация не совпадает, то выдает ошибку при компиляции кода. И что печатает.

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

есть ответы, говорящие, что полиморфизм является наследованием, и это неправильно. Хотя вы можете использовать наследование для создания полиморфного поведения, и обычно это то, что вы делаете, но это не то, что полиморфизм.

во-первых, вам не нужно наследование, чтобы иметь полиморфизм, как описано выше.

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