Объяснить полиморфизм

Что такое полиморфизм? Я не уверен, что правильно понимаю.

В области Python то, что я получаю, заключается в том, что я могу определить следующие параметры:

def blah (x, y) 

без необходимости указывать тип, в отличие от другого языка, такого как Java, где он будет выглядеть больше по строкам:

 public void blah (int x, string y) 

Правильно ли я понимаю?

6 Solutions collect form web for “Объяснить полиморфизм”

Остерегайтесь того, что разные люди используют разные термины; в частности, часто возникает разрыв между объектно-ориентированным сообществом и сообществом теории языка программирования (остальной частью).

Вообще говоря, полиморфизм означает, что метод или функция способны справляться с различными типами ввода. Например, метод add (или + operator) в классе Integer может выполнять целочисленное добавление, тогда как метод add в классе Float выполняет добавление с плавающей запятой, а метод add в классе Bignum выполняет правильные операции для произвольного размера номер. Полиморфизм – это способность вызывать метод add на объекте, не зная, какой он номер.

  • Одним из видов полиморфизма, который обычно называют параметрическим полиморфизмом в функциональном сообществе и общим программированием в сообществе ООП, является способность выполнять определенные операции над объектом, не заботясь о его точном типе. Например, чтобы отменить список, вам не нужно заботиться о типе элементов списка, вам просто нужно знать, что это список. Таким образом, вы можете написать общий (в этом смысле) код разворота списка: он будет работать тождественно в списках целых чисел, строк, виджетах, произвольных объектах и ​​т. Д. Но вы не можете писать код, который добавляет элементы списка в общем виде, потому что способ, которым элементы интерпретируются как числа, зависит от того, какой тип они есть.

  • Другой тип полиморфизма, обычно называемый ad-hoc-полиморфизмом или (по крайней мере, для некоторых его форм), общим программированием в функциональном сообществе и часто подтиповым полиморфизмом (хотя это несколько ограничивает понятие) в сообществе ООП, это способность иметь один метод или функция, которая ведет себя по-разному в зависимости от точного типа своих аргументов (или для методов – типа объекта, метод которого вызывается). Приведенный выше пример является ad-hoc-полиморфизмом. В динамически типизированных языках эта способность само собой разумеется; статически типизированные языки имеют тенденцию (но не обязательно ) иметь такие ограничения, как требование, чтобы аргумент был подклассом какого-либо определенного класса ( Addable ).

Полиморфизм заключается не в необходимости указывать типы при определении функции. Это больше связано со статическим и динамическим типированием, хотя это не является неотъемлемой частью проблемы. Динамически типизированные языки не нуждаются в объявлениях типов, в то время как статически типизированные языки обычно нуждаются в объявлениях определенного типа (от довольно многого в Java до почти нет в ML).

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

Полиморфизм

Ответы, которые вы получили, хороши и объясняют, что такое полиморфизм. Я думаю, что это также поможет понять некоторые из причин, по которым это полезно.

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

 def dosomething(thing): if type(thing)==suchandsuch: #do some stuff elif type(thing)==somesuch: #do some other stuff elif type(thing)==nonesuch: #yet more stuff 

Есть некоторые проблемы с этим. Самым большим является то, что он вызывает очень плотную связь и много повторений. Вероятно, у вас будет такой же набор тестов во многих местах вашего кода. Что произойдет, если вы добавите новый тип, который должен поддерживать эту операцию? Вам нужно найти все места, где у вас есть такой условный, и добавить новую ветку. И, конечно же, вы должны иметь доступ ко всему исходному коду, чтобы иметь возможность вносить эти изменения. В дополнение к этой условной логике, подобной этой, многословна и трудно понять в реальных случаях.

Лучше всего писать:

 thing.dosomething() 

Помимо того, что это намного короче, это приводит к значительному ослаблению сцепления. Этот пример / объяснение ориентировано на традиционные языки OO, такие как Python. Детали немного отличаются, например, от функциональных языков. Но большая часть полиморфизма остается неизменной.

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

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

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

В Python, поскольку вещи динамически типизированы, интерфейс менее формален, но идея одна и та же: вызов foo () будет успешным на двух объектах, которые знают, как правильно реализовать foo (), но нам все равно, какой тип они действительно есть.

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

Например, Bird and Plane являются FlyingObject. Таким образом, FlyingObject имеет метод fly() и метод fly() and Plane для реализации fly() . Птица и План летают по-разному, поэтому реализации различны. С точки зрения клиентов, не имеет значения, как летать Bird или Plane, они могут просто вызвать метод fly() для объекта FlyingObject, не имеет значения, является ли этот объект Plan или Bird.

То, что вы описываете, – это динамическая и статическая проверка типов, совместимость типов которых выполняется во время выполнения и время компиляции.

Надеюсь. NawaMan

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

Длинный ответ: от древнегреческого poly (many) + morph (form) + -ism.

Полиморфизм – это общий метод, позволяющий обрабатывать разные типы в некотором роде. Примеры в мире программирования включают:

  • parametric polymorphism (рассматривается как дженерики в Java)
  • subtyping polymorphism , реализованный в Java, используя динамическую отправку сообщений между экземплярами объекта.
  • ad-hoc polymorphism , который относится к способности определять функции с тем же именем, которые различаются только по типам, с которыми они имеют дело (перегрузка на Java).

Слово полиморфизм также используется для описания понятий в других, не связанных между собой областях, таких как генетика .

  • Что эквивалентно объектно-ориентированным конструкциям в python?
  • Когда используется __call__ хорошая идея?
  • Являются ли интерфейсы просто «синтаксическим сахаром»?
  • Что такое питоновский способ инъекции зависимостей?
  • многопроцессорная подсистема python.Process
  • Функция переключения имен Python
  • Является ли хорошей практикой делать вложенный класс в python?
  • Объем имен, определенных в блоке классов, не распространяется на блоки методов. Почему это?
  • дизайн класса python (метод staticmethod vs)
  • Переменные класса одного типа в Python
  • Наследование Python и вызов конструктора родительского класса
  • Python - лучший язык программирования в мире.