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

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

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

def blah (x, y)

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

public void blah (int x, string y)

Я разбираюсь в этом?

12
задан Peter Mortensen 12 December 2010 в 17:30
поделиться

9 ответов

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

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

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

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

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

23
ответ дан 2 December 2019 в 03:04
поделиться

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

Polymorphism

14
ответ дан 2 December 2019 в 03:04
поделиться

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

Длинный ответ: От древнегреческого поли (много) + морф (форма) + -изм.

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

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

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

1
ответ дан 2 December 2019 в 03:04
поделиться

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

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

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

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

4
ответ дан 2 December 2019 в 03:04
поделиться

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

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

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

  1. Различная сигнатура метода и разное количество или тип параметры.
  2. Такая же сигнатура метода, но другое количество параметров.
  3. Та же сигнатура метода и такое же количество параметров, но другого типа
-3
ответ дан 2 December 2019 в 03:04
поделиться

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

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

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

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

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

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

1
ответ дан 2 December 2019 в 03:04
поделиться

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

Java, C, 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's a base pointer.

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

1
ответ дан 2 December 2019 в 03:04
поделиться

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

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

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

9
ответ дан 2 December 2019 в 03:04
поделиться

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

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

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

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

2
ответ дан 2 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: