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

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

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

def blah (x, y)

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

public void blah (int x, string y)

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

11 ответов


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

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

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

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

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


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

Polymorphism


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

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

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

например (в ближнем псевдо-коде):

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. полиморфизм времени выполнения : Полиморфизм времени выполнения также известен как переопределение метода Переопределение метода означает наличие двух или более методов с тем же именем , той же сигнатурой, но с другой реализацией
      1. полиморфизм времени компиляции : Полиморфизм времени компиляции, также известный как перегрузка метода Перегрузка метода означает наличие двух или более методов с одинаковым именем, но с разными сигнатурами
  • в информатике полиморфизм-это программирование языковая функция, позволяющая обрабатывать значения различных типов данных с помощью единого интерфейса. Понятие параметрического полиморфизма применимо как к типам данных, так и к функциям. Функция, которая может оценивать или применяться к значениям различных типов, известна как полиморфная функция. Тип данных, который может казаться обобщенным типом (например, список с элементами произвольного типа), обозначается полиморфным типом данных, таким как обобщенный тип, из которого такие специализации сделанный.
  • недостатки полиморфизм:
    • полиморфизм снижает читаемость программы. Необходимо визуализировать поведение программы во время выполнения для определения фактического класса времени выполнения. Также становится трудно перемещаться по классам, реализующим эту концепцию. Даже sofasticated IDEs не может обеспечить эту функцию навигации. Это в некоторой степени увеличивает расходы на обслуживание.

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


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

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

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

  1. различная подпись метода и различные номер или тип параметры.
  2. та же сигнатура метода, но другое количество параметров.
  3. та же подпись метода и то же количество параметров, но другого типа