Я просмотрел другие определения и объяснения, и ни одно из них меня не удовлетворило. Я хочу посмотреть, сможет ли кто-нибудь определить полиморфизм не более чем в двух предложениях без использования кода или примеров. Я не хочу слышать «Итак, у вас есть человек / машина / консервный нож ...» или как это слово образовано (никого не впечатляет, что вы знаете, что означают поли и морфинг). Если вы хорошо понимаете, что такое полиморфизм, и хорошо владеете английским языком, тогда вы сможете ответить на этот вопрос в кратком, хотя и плотном, определении. Если ваше определение точно определяет полиморфизм, но настолько плотно, что требует нескольких повторений, то это именно то, что я ищу.
Почему всего два предложения? Потому что определение короткое и разумное. Объяснение длинное и содержит примеры и код. Поищите здесь объяснения (ответ на этих страницах не является удовлетворительным для моего вопроса):
Полиморфизм против переопределения против перегрузки
Попытайтесь описать полиморфизм как можно проще
Почему я задаю этот вопрос? Потому что мне задали тот же вопрос, и я обнаружил, что не могу дать удовлетворительного определения (по моим стандартам, которые довольно высоки). Я хочу посмотреть, сможет ли кто-нибудь из великих умов на этом сайте сделать это.
Если вы действительно не можете сделать требование двух предложений (это сложная тема для определения), тогда ничего, если вы перейдете. Идея состоит в том, чтобы иметь определение, которое на самом деле определяет, что такое полиморфизм, и не объясняет, что он делает и как его использовать (понимаете разницу?).
источник
Ответы:
Полиморфизм позволяет выражать своего рода контракт, причем потенциально многие типы реализуют этот контракт (будь то через наследование классов или нет) разными способами, каждый в соответствии со своей целью. Код, использующий этот контракт, не должен (*) заботиться о том, какая реализация задействована, а только о том, что контракт будет соблюдаться.
(*) Во всяком случае, в идеальном случае - очевидно, что часто вызывающий код выбирает подходящую реализацию осознанно!
источник
Как правило, фрукты можно есть, но разные фрукты едят по-разному. Яблоко, которое является фруктом, можно есть (потому что это фрукт). Банан тоже можно есть (потому что это тоже фрукт), но иначе, чем яблоко. Вы сначала очистите его.
Ну, по крайней мере, знаю, но в некоторых манерах я странный, так что я знаю.
Это иллюстрирует наследование (фрукты можно есть), полиморфизм (то, что ест фрукты, может есть все виды фруктов) и инкапсуляцию (у банана есть кожица).
Если серьезно, то наследование объектов, полиморфизм, инкапсуляция, виртуальные вещи, абстрактные вещи, частные вещи, публичные вещи - все это сложные концепции. Если кто-то абсолютно хочет иметь это определение из двух предложений, пометьте вопрос как вариант кода-гольфа, потому что два таких предложения должны быть настолько краткими, что, если вы не знаете, что это уже есть, вы не узнаете достаточно о чтобы знать, о чем вам нужно узнать больше.
источник
Полиморфизм объявляет унифицированный интерфейс, который не знает типов, оставляя детали реализации конкретным типам, реализующим интерфейс.
источник
Википедия: Полиморфизм - это функция языка программирования, которая позволяет обрабатывать значения разных типов данных с помощью единого интерфейса. Для меня это довольно просто.
источник
На самом деле, существует множество форм полиморфизма, и по этому поводу ведутся споры; вы даже можете встретить профессоров CS, которые не могут дать ему правильного определения. Мне известны три типа:
специальный полиморфизм (выглядит как утка и ходит как утка => это утка). Его можно увидеть, например, в Haskell и Python.
общий полиморфизм (где тип является экземпляром некоторого универсального типа). Это можно увидеть, например, в C ++ (вектор типа int и вектор строки имеют размер функции-члена).
полиморфизм подтипа (когда тип наследуется от другого типа). Его можно увидеть в большинстве языков программирования OO (т.е. треугольник - это форма).
источник
Я действительно понимаю, почему вы задаете этот вопрос. Я понимаю полиморфизм, но на собеседовании меня попросили дать краткое и четкое определение полиморфизма. Поскольку я не мог дать четкого и краткого определения, я начал думать об этом, и вот мое определение:
Возможность объектов одного типа иметь один и тот же интерфейс, но разную реализацию этого интерфейса.
источник
Определение :
Полиморфизм - это слово за 10 долларов для идеи за 1 доллар: когда я прошу что-то сделать, меня не волнует, как это достигается, если конечный результат подходит. Пока сервис правильно при условии, я не забочусь о реализации .
Обсуждение
Хотя он обычно используется при разработке программного обеспечения, особенно в системах, разработанных в соответствии с объектно-ориентированными принципами, полиморфизм, по сути, является принципом реального мира и должен определяться в терминах реального мира, а не в технологических.
Примеры
Когда я хочу позвонить, я беру трубку, набираю номер и разговариваю с собеседником на другом конце. Меня не волнует, кто сделал телефон, какую технологию он использует, будь то проводной, беспроводной, мобильный или VOIP, или находится ли он на гарантии.
Когда я хочу распечатать документ, я распечатываю его. Меня не волнует язык реализации, марка принтера, стиль подключения, выбор расходных материалов или качество бумаги.
источник
Encapsulation
для меняНесколько реализаций одного и того же интерфейса.
Пример: во многих моделях телефонов реализован интерфейс цифровой клавиатуры.
источник
Полиморфизм - это объектно-ориентированная стратегия, используемая при проектировании объектных моделей для упрощения кода. По своей сути полиморфизм - это способность определять два похожих, но разных объекта, а затем обрабатывать эти два объекта, как если бы они были одинаковыми.
Хорошо, это сложно ....
источник
Я просто подумал, что добавлю свою собственную интерпретацию того, что такое полиморфизм: в общем, полиморфизм - это акт предоставления единого интерфейса для сущностей разных типов .
Это довольно общий вариант, но это единственный способ обернуть все три типа полиморфизма, о которых я знаю: специальный , параметрический и подтипный . Я расскажу подробнее ниже и отсортировал типы полиморфизма по имени и в алфавитном порядке. То, что вас интересует, - это, скорее всего, полиморфизм подтипа , который является последним.
Специальный полиморфизм
Специальный полиморфизм - это предоставление нескольких реализаций одного и того же метода для разных типов параметров. В ООП это обычно называется перегрузкой метода . Например:
Оба
format
метода имеют общий интерфейс , но работают с сущностями разных типов .Параметрический полиморфизм
Параметрический полиморфизм - это действие, заставляющее класс (или метод) работать с типом, который сам является параметром класса (или метода). Его часто называют дженериками .
Например, Java
List[T]
ожидает параметрT
во время создания экземпляра, и этот параметр определяет тип результирующего объекта.Обратите внимание на пуристов, что я намеренно игнорирую « сырые» типы, так как чувствую, что они просто замутят воду в этом контексте.
List[String]
иList[Date]
разделяют единый интерфейс , но работают с (и являются) разными типами .Полиморфизм подтипа
Полиморфизм подтипа, вероятно, - это то, что вы изначально имели в виду в своем вопросе: это акт предоставления единого интерфейса для нескольких реализаций одного и того же типа.
Чтобы использовать обычный пример:
Animal
предоставляет контракт, который должны соблюдать все реализации.Dog
является объектомAnimal
и, как таковой, поддерживает все операции, которыеAnimal
объявляет. Согласно принципу подстановки Лискова , это позволяет вам использовать экземпляр, вDog
которомAnimal
ожидается экземпляр (но не наоборот).Если
Cat
иDog
являются подклассамиAnimal
, то они имеют общий интерфейс, но на самом деле являются разными типами .Я ухожу здесь немного касательно, но полиморфизм подтипа (я думаю) единственный, который позволяет переопределить : акт переопределения поведения метода, определенного родительским классом. Это часто путают с перегрузкой, которая, как мы видели ранее, является типом полиморфизма и на самом деле не требует подклассов (да и не требует классов).
источник
Кажется, здесь представлены лучшие определения, поэтому позвольте мне добавить свои два цента, пожалуйста, только для других наблюдателей. Надеюсь, это поможет больше.
Есть два вида полиморфизма:
Это просто перегрузка метода и перегрузка оператора
Первый термин унаследован от терминологии Java и C ++.
Но в терминологии .NET только второй ( я имею в виду полиморфизм времени выполнения ) действительно предполагается полиморфизмом и просто называется полиморфизмом .
Насколько я знаю, есть три метода реализации полиморфизма ( времени выполнения ) .
Простой пример интерфейсного полиморфизма:
Выход:
источник
Полиморфизм - это абстракция программного кодирования, в которой несколько различных базовых сущностей (обычно данные, но не всегда) имеют общий интерфейс, который позволяет им выглядеть и действовать одинаково во время выполнения. Мы используем это в качестве метода разработки для обеспечения согласованного поведения в широком диапазоне похожих, но не идентичных экземпляров с минимальной реализацией, что снижает вероятность ошибок и несоответствий.
Павел.
источник
полиморфизм == несколько классов + одинаковые сигнатуры методов + поведение, зависящее от класса.
источник
Множественные формы одного объекта называется полиморфизмом.
источник
Полиморфизм
Различные объекты могут реагировать на одно и то же сообщение по-разному, позволяя объектам взаимодействовать друг с другом, не зная их точного типа.
Через: http://www.agiledata.org/essays/objectOrientation101.html
источник
Полиморфизм - это способность объекта выглядеть и вести себя по-разному при одном и том же вызове. Пример: каждое животное выглядит и звучит по-разному (когда вы его ударяете :))
источник
Полиморфизм - это особенность языков программирования, которая позволяет рассматривать объект как экземпляр его супертипа.
источник
Присвоение единого имени набору аналогичных операций над разными типами. Когда все сделано хорошо, аналогия очевидна, например, «сложение» чисел арифметически и «добавление» строк путем конкатенации (которая суммирует их длину).
источник
Это определение, которому я всегда следовал:
Два объекта полиморфны (по отношению к определенному протоколу) между ними, если оба отвечают на одни и те же сообщения с одинаковой семантикой.
Полиморфизм - это сообщения, способность отвечать на один и тот же набор сообщений с одинаковой семантикой.
Если два объекта МОГУТ ответить на пустой? но семантика сообщения другая, значит .. они не полиморфны.
источник
Полиморфизм на более низком уровне - это возможность вызывать методы, определенные разработчиками интерфейса, из экземпляра интерфейса.
источник
Полиморфизм - это функция программирования, которая позволяет объекту иметь множество типов («форм») и позволяет вам рассматривать его как любой из этих типов в зависимости от того, что вам нужно делать, не зная и не заботясь о других его типах.
источник
Полиморфизм - это языковая функциональность, позволяющая высокоуровневому алгоритмическому коду работать без изменений с несколькими типами данных. А другое предложение, что бы оно ни было для ... ;-P.
(Типы, поддерживаемые C ++, перечислены и противопоставлены в моем ответе: Полиморфизм в C ++ )
источник
В последнее время понятие полиморфизма стало явлением. Вот настоящий дрейф. Среда выполнения определяет, какой подметод должен быть вызван ссылкой на суперкласс. Итак, что означает на практике? На самом деле это ничего не значит. Вы можете кодировать просто без полиморфизма. Итак, почему? Потому что, если у нас нет полиморфизма, нам нужно запомнить все определения функций подкласса. На практике от этого нас избавляет полиморфизм.
Вы можете определить список следующим образом:
но если вы проверите
IList
, вы можете воспользоваться интерфейсом как:и используйте
IList
ссылку свободно. Предполагая, чтоIList
это также реализовано в другом классе, вы можете использовать методы этого неизвестного класса с помощью повторнойIList
ссылки, не пытаясь запомнить это имя класса. Прекрасно, не правда ли?Теперь поступает более ценная информация:
Java по умолчанию полиморфна, тогда как .NET и C ++ не являются, в MS вы должны объявить базовую функцию
virtual
(иoverride
ключевое слово .NET ).Кроме того, в полиморфизме есть 2 интегральных правила. Один из них - наследование (через имплантированный интерфейс или через расширение класса), а другой - переопределение. Без переопределения полиморфизма не существует. Обратите внимание, что перегрузка метода (которая всегда в одном классе) также является типом «минималистичного» полиморфизма.
источник
Для данной сигнатуры метода разные реализации метода выполняются для разных, иерархически связанных классов.
источник
Полиморфизм - это способность использовать разные классы, реализующие общий интерфейс (или расширяющие общий базовый класс) общим способом, без необходимости в конкретной реализации и с использованием только методов, доступных в общем интерфейсе.
То есть: в Java, поскольку ArrayList и LinkedList реализуют List, если вы объявляете переменную как List, вы всегда можете выполнять операции, разрешенные в List, независимо от того, была ли переменная создана как ArrayList или LinkedList.
источник
Сущности одного типа (то есть реализованные с одним и тем же интерфейсом или производные от одного класса) ведут себя по-разному (под одним и тем же именем метода).
источник
Я думаю, что реализация методов одной и той же сигнатуры в разных классах (имеющих какое-то отношение наследования с использованием расширений или реализаций) является переопределением метода, а также полиморфизмом, потому что таким образом мы достигаем многих форм одной и той же сигнатуры метода.
источник
Думаю, иногда объекты вызываются динамически. Вы не уверены, будет ли объект треугольником, квадратом и т. Д. В поли классической формы. пример.
Итак, чтобы оставить все это позади, мы просто вызываем функцию производного класса и предполагаем, что будет вызвана функция динамического класса.
Вам все равно, квадрат это, треугольник или прямоугольник. Вы просто заботитесь о местности. Следовательно, метод getArea будет вызываться в зависимости от переданного динамического объекта.
источник
Полиморфизм - это способность функции автоматически адаптироваться к приему входных данных различных типов. Вы можете «Сложить» два двойных «1.1» и «2.2» и получить «3.3» или «Добавить» две строки «Стек» и «Переполнение» и получить «StackOverflow».
источник
Полиморфизм - это когда разные объекты по-разному реагируют на один и тот же метод. Например, машина движется по дороге, а человек идет по дороге. Это два объекта, которые по-разному реагируют на одну и ту же дорогу.
источник