Полиморфизм – определение только двух предложений

Я посмотрел на другие определения и объяснения, и никто из них не удовлетворил меня. Я хочу узнать, может ли кто-нибудь определить polymorphism не более чем в двух предложениях без использования какого-либо кода или примеров. Я не хочу слышать «Итак, у вас есть человек / автомобиль / консервный нож …» или как получается слово (никто не впечатлен тем, что вы знаете, что означает поли и морф). Если у вас есть очень хорошее представление о том, что такое polymorphism и хорошо владейте английским языком, вы должны быть в состоянии ответить на этот вопрос в кратком, хотя и плотном, определении. Если ваше определение точно определяет polymorphism, но настолько плотно, что требует нескольких считываний, то это именно то, что я ищу.

Почему только два предложения? Потому что определение короткое и интеллектуальное. Объяснение длинное и содержит примеры и код. Посмотрите здесь объяснения (ответ на эти страницы не подходит для моего вопроса):

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

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

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

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

(*) В идеальном случае, во всяком случае, очевидно, что часто вызывающий код выбрал соответствующую реализацию очень преднамеренно!

Фрукты можно есть, как правило, но разные виды фруктов едят по-разному. Яблоко, которое является плодом, можно есть (потому что это плод). Банан можно также съесть (потому что это также плод), но по-другому от яблока. Сначала вы очищаете его.

Ну, по крайней мере, я знаю, но я странный в манерах, так что я знаю.

Это иллюстрирует наследование (фрукты можно съесть), polymorphism (то, что съедает фрукты, может съесть все виды фруктов) и инкапсуляция (у банана есть кожа).

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

Полиморфизм объявляет единый интерфейс, который не знает тип, оставляя детали реализации конкретным типам, реализующим интерфейс.

На самом деле, существует несколько форм polymorphismа, и вокруг него есть довольно много противоречий; вы даже можете увидеть профессоров CS, которые не могут определить его должным образом. Я знаю о трех типах:

  • ad-hoc polymorphism (выглядит как утка и ходит как утка => утка). Например, в Haskell и Python.

  • общий polymorphism (где тип – это экземпляр некоторого родового типа). Например, можно увидеть в C ++ (вектор int и вектор строки имеют размер функции-члена).

  • подтип polymorphismа (где тип наследуется от другого типа). Можно увидеть на большинстве языков программирования OO (т. Е. Треугольник – это форма).

Википедия: Полиморфизм – это функция языка программирования, которая позволяет обрабатывать значения разных типов данных с использованием единого интерфейса. Довольно просто для меня.

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

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

Определение :

Полиморфизм – это $ 10 слов за идею за 1 доллар – когда я прошу что-то сделать, мне все равно, как это достигается, если конечный результат уместен. Пока услуга предоставляется правильно, я не забочусь о ее реализации .

обсуждение

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

Примеры

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

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

Несколько реализаций одного и того же интерфейса.

Пример: во многих моделях телефона реализована цифровая клавиатура.

Полиморфизм – это объектно-ориентированная страtagsя, используемая при проектировании объектных моделей, чтобы упростить код. В его основном polymorphismе есть способность определять два simillar, но разные объекты, а затем обрабатывать два объекта, как если бы они были одинаковыми.

Хорошо, это сложно ….

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

Павел.

polymorphism == несколько classов + одинаковые сигнатуры методов + поведение, специфичное для classа.

Я просто подумал, что добавлю свою собственную интерпретацию того, что такое polymorphism: В общем, polymorphism – это акт обеспечения единого интерфейса для объектов разных типов .

Это довольно общий, но это единственный способ, с помощью которого я могу обернуть все три типа polymorphismов, о которых я знаю: ad hoc , параметрический и подтип . Ниже я расскажу подробнее, и отсортировал типы polymorphismа по имени, в алфавитном порядке. Тот, который вам интересен, скорее всего, является подтипом polymorphismа , который является последним.

Специальный polymorphism

Ad hoc-polymorphism является актом предоставления нескольких реализаций того же метода для разных типов параметров. В ООП его обычно называют перегрузкой метода . Например:

 public String format(int a) { return String.format("%2d", a); } public String format(Date a) { return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a); } 

Оба метода format используют один интерфейс , но они работают с объектами разных типов .

Параметрический polymorphism

Параметрический polymorphism – это акт создания classа (или метода) для типа, который сам является параметром classа (или метода). Его часто называют дженериками .

Например, List[T] Java List[T] ожидает параметр T во время создания экземпляра, и этот параметр определяет тип результирующего объекта.

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

List[String] и List[Date] обмениваются одним интерфейсом , но работают с (и являются) разными типами .

Политизм подтипа

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

Чтобы использовать обычный пример: Animal предоставляет контракт, который должны соблюдаться всеми реализациями. Dog является Animal , и поэтому поддерживает все операции, которые объявляет Animal . Согласно принципу подписи Лискова , это позволяет использовать экземпляр Dog где ожидается экземпляр Animal (но не наоборот).

Если Cat и Dog являются подclassами Animal , то они разделяют один интерфейс, но на самом деле разные типы .

Я собираюсь здесь немного касаться, но политизм подтипа (я думаю) единственный, который позволяет переопределить : действие переопределения поведения метода, определенного родительским classом. Это часто путают с перегрузкой, которая, как мы видели ранее, является типом polymorphismа и на самом деле не нуждается в подclassов (а также не требует classов).

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

Существует два вида polymorphismа:

 1. Compile-time (static) polymorphism or (ad hoc) polymorphism. 

Это просто перегрузка метода и перегрузка оператора

 2. Run time or (dynamic) polymorphism. 

Первый термин наследуется от терминов Java и C ++.

Но в терминологии .NET только второй ( я имею в виду polymorphism времени выполнения ) действительно предполагается polymorphismом и просто называется polymorphismом .

И насколько я знаю, существует три метода polymorphismа ( времени выполнения ).

  1. Parametric polymorphism or simply the use of generics (templates in C++). 2. Inheritance-based polymorphism or subtyping. 3. Interface-based polymorphism. 

Простой пример polymorphismа на основе интерфейса:

 interface Imobile { void Move(); } class Person :Imobile { public void Move() { Console.WriteLine("I am a person and am moving in my way."); } } class Bird :Imobile { public void Move() { Console.WriteLine("I am a bird and am moving in my way."); } } class Car :Imobile { public void Move() { Console.WriteLine("I am a car and am moving in my way."); } } class Program { static void Main(string[] args) { // Preparing a list of objects List mobileList = new List(); mobileList.Add(new Person()); mobileList.Add(new Bird()); mobileList.Add(new Car()); foreach (Imobile mobile in mobileList) { mobile.Move(); } // Keep the console open Console.WriteLine("Press any key to exit the program:"); Console.ReadKey(); } } 

Вывод:

  I am a person and am moving in my way. I am a bird and am moving in my way. I am a car and am moving in my way. Press any key to exit the program: 

Несколько форм одного объекта называются polymorphismом.

Полиморфизм – это способность объекта появляться и вести себя по-разному для одного и того же вызова. ex: каждое животное появляется и звучит по-разному (когда вы ударяете его :))

Полиморфизм – это особенность языков программирования, которая позволяет рассматривать объект как экземпляр его супертипа.

Предоставление единого имени для набора аналогичных операций для разных типов. Когда все сделано хорошо, аналогия очевидна, например, «добавление» чисел арифметически и «добавление» строк путем конкатенации (которая суммирует их длины).

Полиморфизм

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

Через: http://www.agiledata.org/essays/objectOrientation101.html

Это определение, которое я всегда соблюдал:

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

Полиморфизм связан с сообщениями, заключается в возможности отвечать на один и тот же набор сообщений одной и той же семантикой.

Если два объекта CAN ответят на пустое? но семантика сообщения отличается, тогда .. они не являются полиморфными.

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

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

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

(Типы поддержки C ++ перечислены и сопоставлены в моем ответе: Полиморфизм в c ++ )

В последнее время концепция polymorphismа стала явлением. Вот фактический дрейф. Runtime определяет, какой подтет должен быть вызван ссылкой суперclassа. Теперь, что на практике означает? Это на самом деле ничего не значит. Вы можете просто кодировать без polymorphismа. Итак, почему? Потому что, если у нас нет polymorphismа, нам нужно запомнить все определения функций подclassа. Полиморфизм спасает нас от этого на практике.

Вы можете определить список следующим образом:

 List list = new List(); 

но если вы проверите IList , вы можете воспользоваться интерфейсом как:

 IList list = new List(); 

и используйте ссылку IList свободно. Предполагая, что IList также реализован в другом classе, вы можете использовать методы этого неизвестного classа через ссылку IList не пытаясь запомнить это имя classа. Замечательно, не так ли?

Теперь появляется более ценная информация:
Java по умолчанию является полиморфной, тогда как .NET и C ++ в MS нет, вы должны объявить базовую функцию virtual (и ключевое слово .NET override ).

Кроме того, в polymorphismе существует 2 интегральных правила. Один из них – наследование (через интерфейс impl или через расширение classа), а другое – переопределение. Без переопределения polymorphismа не существует. Обратите внимание, что перегрузка метода (которая всегда находится в одном classе) также является типом «минималистического» polymorphismа.

Для данной сигнатуры метода выполняются разные реализации методов для разных classов, связанных с иерархией.

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

Т.е.: в Java, поскольку ArrayList и LinkedList реализуют List, если вы объявляете переменную как List, вы всегда можете выполнять операции, разрешенные в List, независимо от того, была ли указана переменная как ArrayList или LinkedList.

Объекты одного типа (т. Е. Реализующие один и тот же интерфейс или производные от одного classа) ведут себя по-разному (под тем же именем метода).

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

Я предполагаю, что иногда объекты динамически называют. Вы не уверены, будет ли объект треугольником, квадратом и т. Д. В classической форме poly. пример.

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

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

Полиморфизм – это способность функции автоматически адаптироваться к принятию входных данных разных типов данных. Вы можете «Добавить» два удвоения «1.1» и «2.2» и получить «3.3» или «Добавить» две строки «Стек» и «Переполнение» и получить «StackOverflow».

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

  • В чем разница между деревом parsingа и АСТ?
  • Что такое самоуверенное программное обеспечение?
  • Что такое iterator, итерация, итерация?
  • Глобальная область и глобальное пространство имен
  • Что такое объект без состояния в Java?
  • NULL разрешено в основном ключе - почему и в какой СУБД?
  • Что такое непрозрачное значение в C ++?
  • Что такое инъекция зависимости?
  • Что такое reflection и почему оно полезно?
  • В чем разница между веб-сайтом и веб-приложением?
  • В чем разница между пространством ядра и пользовательским пространством?
  • Interesting Posts

    Всплывающее окно, чтобы отобразить некоторые fragmentы в fragmentе

    Howto переключить / chage идентификатор пользователя с помощью скрипта bash для выполнения команд в том же скрипте?

    Как получить список свойств classа?

    Высокий шум, исходящий от компьютера

    Вычисление MAPE в H2o: Ошибка: при условии, что тип столбца POSIXct неизвестен

    указать файл проекта с помощью msbuild

    все еще запутались в отношении ковариации и контравариантности и входа / выхода

    Как скопировать содержимое одного canvasа на другой canvas на локальном уровне

    Загрузите ВСЕ папки, подфайлы и файлы с помощью Wget

    Сборка смешанного режима в .NET 4

    Как сделать контрольную сумму SHA1 в C #?

    EF5 Получение этого сообщения об ошибке: Совместимость модели не может быть проверена, поскольку firebase database не содержит метаданных модели

    В чем разница между атрибутами background, backgroundTint, backgroundTintMode в макете xroid?

    Найти позицию элемента в C ++ 11 для цикла?

    Рекурсивный диапазон в Lisp добавляет период?

    Давайте будем гением компьютера.