Объясните полиморфизм - PullRequest
12 голосов
/ 24 июля 2010

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

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

public void blah (int x, string y)

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

Ответы [ 11 ]

23 голосов
/ 24 июля 2010

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

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

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

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

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

14 голосов
/ 24 июля 2010

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

Polymorphism

9 голосов
/ 25 июля 2010

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

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

4 голосов
/ 24 июля 2010

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

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

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

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

2 голосов
/ 24 июля 2010

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

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

Что вы описываетединамическая и статическая проверка типов, совместимость типов которой выполняется во время выполнения и во время компиляции соответственно.

Надеюсь, это удастся.NawaMan

1 голос
/ 24 июля 2010

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

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

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

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

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

1 голос
/ 24 июля 2010

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

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

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

Обычно он используется так:

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

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

1 голос
/ 24 июля 2010

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

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.

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

0 голосов
/ 06 июля 2017

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

0 голосов
/ 01 февраля 2016

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

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