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

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

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

def blah (x, y)

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

public void blah (int x, string y)

Я правильно понял?

Ответ 1

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

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

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

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

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

Ответ 2

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

Polymorphism

Ответ 3

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

В некоторых языках, которые не имеют полиморфизма, вы оказываетесь в ситуациях, когда вы хотите выполнять концептуально одну и ту же операцию на разных типах объектов, в случаях, когда эта операция должна выполняться по-разному для каждого типа. Например, в синтаксисе типа 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. Детали немного отличаются, например, от функциональных языков. Но большая часть полиморфизма остается неизменной.

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Надеюсь на это. NawaMan

Ответ 6

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

Java, C, С++ и другие, используют статическую типизацию. В этом случае вы должны указать, что типы - это время компиляции.

Python и Ruby используют динамику в том, что ввод текста выводится во время интерпретации.

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

Например (в ближайшем псевдокоде):

class Base
{
  virtual void Draw() { //base draw}
}

class Derived: public Base
{
  void Draw() { //derived draw}
}

Base* myBasePtr = new Derived();

myBasePtr->Draw(); //invokes Derived::Draw(), even though it a base pointer.

Это полиморфизм.

Ответ 7

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

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

Например, если у вас есть автомобиль в качестве корневого класса и автомобиля и велосипеда в качестве экземпляров, то car.calculateDistance() будет работать на основе газа, если автомобиль является экземпляром автомобиля и будет действовать на основе выносливости велосипедист, если это был тип велосипеда.

Обычно он используется следующим образом:

getTotalDistance(Vehicle[] vehicle) {
    int dist=0
    for each vehicle
        dist+=vehicle.calculateDistance();

Обратите внимание, что вы передаете базовый тип, но экземпляры никогда не будут самим Транспортным средством, но всегда являются дочерним классом Vehicle, но вы НЕ относите его к типу child. Полиморфизм означает, что транспортное средство превращается во все, что требуется ребенку.

Ответ 8

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

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

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

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

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

Ответ 9

полиморфизм:

  • Один вызов метода работает с несколькими классами, даже если классы нуждаются в разных реализациях;
  • Возможность предоставления нескольких реализаций действия и выбора правильной реализации на основе окружающего контекста;
  • Предоставляет перегрузку и переопределение;
  • Может произойти как во время выполнения, так и во время компиляции;
      • Время выполнения Полиморфизм: Время выполнения Полиморфизм также известен как метод переопределения Средство переопределения метода, имеющее два или более метода с тем же именем, одну и ту же подпись, но с другой реализацией
      1. Время компиляции Полиморфизм: Время компиляции Полиморфизм также известен как перегрузка метода Средство перегрузки метода, имеющее два или более метода с тем же именем, но с разными сигнатурами
В информатике полиморфизм - это функция языка программирования, которая позволяет обрабатывать значения разных типов данных с использованием единого интерфейса. Понятие параметрического полиморфизма применяется как к типам данных, так и к функциям. Функция, которая может оцениваться или применяться к значениям разных типов, известна как полиморфная функция. Тип данных, который может показаться обобщенным типом (например, список с элементами произвольного типа), обозначается как полиморфный тип данных, такой как обобщенный тип, из которого сделаны такие специализации. Недостатки полиморфизма:
  • Полиморфизм уменьшает читаемость программы. Нужно визуализировать поведение программы во время выполнения, чтобы определить действительный класс времени выполнения. Также становится трудно ориентироваться в классах, реализующих эту концепцию. Даже ориентированные среды IDE не могут обеспечить эту навигационную функцию. Это в некоторой степени увеличивает стоимость обслуживания.

Ответ 10

Полиморфизм. Тот же объект действует по-разному в зависимости от сценария, в котором он находится. Например, если 12-летний ребенок был в комнате с кучей детей, тип музыки, которую они слушали, был бы иным, чем если 12-летний ребенок был в комнате, полной взрослых. 12-летний ребенок тот же, однако ребенок действует по-разному в зависимости от сценария, в котором он находится (разная музыка).

Ответ 11

Способность определять функцию в нескольких формах называется Полиморфизм. В С#, Java, С++ существуют два типа полиморфизма: полиморфизм времени компиляции (перегрузка) и полиморфизм времени выполнения ( переопределение).

Переопределение. Переопределение происходит, когда метод класса имеет то же имя и подпись, что и метод в родительском классе.

Перегрузка. Перегрузка определяется во время компиляции. Это происходит, когда несколько методов имеют одинаковые имена:

  • Различная сигнатура метода и другое количество или тип Параметры.
  • Такая же подпись метода, но различное количество параметров.
  • Та же сигнатура метода и одинаковое количество параметров, но различного типа