Что такое полиморфизм, для чего он нужен и как он используется?
oop
polymorphism
computer-science
UnkwnTech
источник
источник
Ответы:
Если вы думаете о греческих корнях термина, это должно стать очевидным.
Таким образом, полиморфизм - это способность (в программировании) представлять один и тот же интерфейс для различных базовых форм (типов данных).
Например, во многих языках целые числа и числа с плавающей запятой неявно полиморфны, так как вы можете добавлять, вычитать, умножать и так далее, независимо от того, что типы разные. Они редко рассматриваются как объекты в обычном выражении.
Но таким же образом класс, подобный
BigDecimal
илиRational
илиImaginary
может также предоставлять эти операции, даже если они работают с различными типами данных.Классическим примером является
Shape
класс и все классы, которые могут наследовать от него (квадрат, круг, додекаэдр, неправильный многоугольник, сплат и т. Д.).При полиморфизме каждый из этих классов будет иметь разные базовые данные. Для точечной формы нужны только две координаты (конечно, при условии, что она находится в двумерном пространстве). Круг нуждается в центре и радиусе. Квадрату или прямоугольнику нужны две координаты для верхнего левого и нижнего правого углов и (возможно) вращения. Нерегулярный многоугольник нуждается в серии линий.
Делая класс ответственным за его код, а также за свои данные, вы можете достичь полиморфизма. В этом примере каждый класс будет иметь свою собственную
Draw()
функцию, и клиентский код может просто выполнить:чтобы получить правильное поведение для любой формы.
Это в отличие от старого способа делать вещи, в которых код был отделен от данных, и у вас были бы такие функции, как
drawSquare()
иdrawCircle()
.Ориентация на объект, полиморфизм и наследование - все это тесно связанные понятия, и их важно знать. В течение моей долгой карьеры было много «серебряных пуль», которые в основном просто кончились, но парадигма ОО оказалась хорошей. Изучите это, поймите это, любите это - Вы будете рады, что сделали :-)
(а) Я изначально писал это как шутку, но она оказалась правильной и, следовательно, не такой уж смешной. Мономер стирола получается из углерода и водорода , а полистирол из его групп .
C8H8
(C8H8)n
Возможно, мне следовало бы заявить, что полип часто встречается в письме,
p
хотя теперь, когда мне пришлось объяснить шутку, даже это тоже не кажется смешным.Иногда вы должны просто выйти, пока вы позади :-)
источник
Poly = many and Morph = change or form
Полиморфизм - это когда вы можете рассматривать объект как универсальную версию чего-либо, но когда вы получаете к нему доступ, код определяет, какой именно это тип, и вызывает соответствующий код.
Вот пример в C #. Создайте четыре класса в консольном приложении:
Теперь создайте следующее в Main () модуля для консольного приложения:
В этом примере мы создаем список базового класса Vehicle, который не знает, сколько колес имеет каждый из его подклассов, но знает, что каждый подкласс отвечает за знание того, сколько у него колес.
Затем мы добавляем в список велосипед, автомобиль и грузовик.
Затем мы можем циклически проходить по каждому Транспортному средству в списке и обрабатывать их все одинаково, однако, когда мы получаем доступ к свойству каждого Транспортного средства «Колеса», класс Vehicle передает выполнение этого кода соответствующему подклассу.
Этот код называется полиморфным, поскольку точный код, который выполняется, определяется подклассом, на который ссылаются во время выполнения.
Я надеюсь, что это поможет вам.
источник
Class_Excel
,Class_CSV
для которого будет вызванReader
класс. В любом случае, какая-то итерация, если / then / else будет где-то сохранена.От понимания и применения полиморфизма в PHP , спасибо Steve Guidetti.
источник
Если кто-нибудь скажет, что CUT этим людям
Что случится?
Таким образом, приведенное выше представление показывает, что такое полиморфизм (то же имя, другое поведение) в ООП.
Если вы идете на собеседование, и интервьюер попросит вас рассказать / показать пример из жизни в полимере в той же комнате, где мы сидим, скажем:
Ответ - Дверь / Окна
Хотите знать, как?
Через дверь / окно - может прийти человек, может прийти воздух, может прийти свет, может прийти дождь и т. Д.
Чтобы понять это лучше и проще, я использовал приведенный выше пример. Если вам нужна ссылка на код, следуйте приведенным выше ответам.
источник
.foo()
метод, то они должны иметь общий интерфейс. Однако это не так и приводит к неправильным абстракциям. Интерфейс должен определять роль, которую следует играть, которая может иметь много разных реализаций, но все они извлекают из одного и того же набора входных данных и возвращают что-то из одного и того же набора выходных данных. Входные данныеx.cut(...)
для хирурга, стилиста или актера не совпадают и не являются выходными данными.Простое объяснение по аналогии
Президент США использует полиморфизм. Как? Ну, у него много советников:
Каждый должен отвечать только за одно: Пример:
Президент не является специалистом по цинкованию или квантовой физике. Он не знает многих вещей - но он знает только одно: как управлять страной.
То же самое с кодом: проблемы и обязанности должны быть разделены между соответствующими классами / людьми. В противном случае вы бы сделали так, чтобы президент знал буквально все в мире - всю Википедию. Представьте, что в вашем коде есть вся википедия: это было бы кошмаром.
Почему это плохая идея для президента знать все эти конкретные вещи?
Если бы президент конкретно говорил людям, что делать, это означало бы, что президент должен точно знать , что делать. Если президенту нужно знать конкретные вещи самому, это означает, что когда вам нужно внести изменения, вам нужно будет сделать это в двух местах, а не в одном.
Например, если EPA меняет законы о загрязнении, то когда это произойдет: вам нужно будет изменить класс EPA, а также класс президента. Изменение кода в двух местах, а не в одном, может быть опасным, потому что его гораздо сложнее поддерживать.
Есть ли лучший подход?
Есть лучший подход: президенту не нужно знать специфику чего-либо - он может требовать лучшего совета от людей, которым конкретно поручено делать эти вещи.
Пример - использования полиморфного подхода:
Все, что президент делает, это просит людей посоветовать ему - и это то, что он на самом деле делает в реальной жизни - и это то, что должен делать хороший президент. все его советники реагируют по-разному, но все они знают, что президент имеет в виду: Advise (). У него сотни людей, стекающихся в его офис. На самом деле не имеет значения, кто они. Все, что президент знает, это то, что, когда он просит их «посоветовать», они знают, как реагировать соответственно :
Такой подход позволяет президенту управлять страной буквально, не зная ничего о военной технике, здравоохранении или международной дипломатии: детали оставлены на усмотрение экспертов. Единственное, что нужно знать президенту, это: «Advise ()».
Что вы не хотите:
НЕТ! НЕТ! НЕТ! В вышеупомянутом сценарии президент делает всю работу: он знает об увеличении численности войск и уже существующих условиях. Это означает, что если ближневосточная политика изменится, то президент должен будет изменить свои команды, а также класс Петреуса. Нам нужно только изменить класс Петреуса, потому что президенту не нужно зацикливаться на таких деталях. Ему не нужно знать о деталях. Все, что ему нужно знать, это то, что если он сделает один заказ, обо всем позаботятся. Все детали должны быть оставлены на усмотрение экспертов.
Это позволяет президенту делать то, что он делает лучше всего: устанавливать общую политику, хорошо выглядеть и играть в гольф: P.
Как это на самом деле реализовано - через базовый класс или общий интерфейс
В сущности, это полиморфизм, в двух словах. Как именно это сделано? Посредством «реализации общего интерфейса» или использования базового класса (наследования) - см. Ответы выше, которые более подробно описывают это. (Чтобы более четко понять эту концепцию, вам нужно знать, что такое интерфейс, и вам нужно будет понять, что такое наследование. Без этого вы можете бороться.)
Другими словами, Петреус, Конди и HealthOfficials бы все классы , которые «реализуют интерфейс» - вызов , давайте его
IAdvisor
интерфейс , который содержит только один метод:Advise()
. Но теперь мы углубляемся в специфику.Это было бы идеально
Резюме
Все, что вам действительно нужно знать, это:
Я действительно надеюсь, что это поможет вам. Если вы ничего не понимаете, оставьте комментарий, и я попробую еще раз.
источник
if healthAdvisor? then do this:
иif petraus then do that etc.
этот шаблон нужно будет повторять, и это не нужно и сложно. см выше редактировать.Полиморфизм - это способность обрабатывать класс объекта как родительский класс.
Например, предположим, что есть класс с именем Animal и класс Dog с наследованием от Animal. Полиморфизм - это способность рассматривать любой объект Dog как объект Animal следующим образом:
источник
classes have different functionality while sharing a common interface
Полиморфизм:
Это концепция объектно-ориентированного программирования. Способность разных объектов реагировать, каждый по-своему, на идентичные сообщения называется полиморфизмом.
Полиморфизм проистекает из того факта, что каждый класс живет в своем собственном пространстве имен. Имена, назначенные в определении класса, не конфликтуют с именами, присвоенными где-либо за его пределами. Это верно как для переменных экземпляра в структуре данных объекта, так и для методов объекта:
Как поля структуры C находятся в защищенном пространстве имен, так и переменные экземпляра объекта.
Имена методов также защищены. В отличие от имен функций C, имена методов не являются глобальными символами. Имя метода в одном классе не может конфликтовать с именами методов в других классах; два очень разных класса могут реализовывать методы с одинаковыми именами.
Имена методов являются частью интерфейса объекта. Когда отправляется сообщение, запрашивающее, чтобы объект что-то сделал, в сообщении указывается метод, который должен выполнить объект. Поскольку разные объекты могут иметь методы с одним и тем же именем, значение сообщения необходимо понимать относительно конкретного объекта, который получает сообщение. Одно и то же сообщение, отправленное двум разным объектам, может вызывать два разных метода.
Основным преимуществом полиморфизма является то, что он упрощает интерфейс программирования. Это позволяет устанавливать соглашения, которые могут быть повторно использованы в классе после класса. Вместо того, чтобы придумывать новое имя для каждой новой функции, которую вы добавляете в программу, одни и те же имена можно использовать повторно. Интерфейс программирования можно описать как набор абстрактных поведений, совершенно отдельно от классов, которые их реализуют.
Примеры:
Пример-1: Вот простой пример написан на Python 2.x .
Пример 2: Полиморфизм реализован в Java с использованием перегрузки методов и концепций переопределения методов .
Рассмотрим пример автомобиля для обсуждения полиморфизма. Взять любую марку, такую как Форд, Хонда, Тойота, БМВ, Бенц и т. Д. Все типа автомобиля.
Но у каждого есть свои собственные расширенные функции и более продвинутые технологии, связанные с их поведением при перемещении.
Теперь давайте создадим базовый тип автомобиля
Car.java
Давайте реализуем пример Ford Car.
Ford расширяет тип Car, чтобы наследовать всех его членов (свойства и методы).
Ford.java
Приведенный выше класс Ford расширяет класс Car, а также реализует метод move (). Несмотря на то, что метод перемещения уже доступен для Ford через Наследование, Ford все же реализовал этот метод по-своему. Это называется переопределением метода.
Honda.java
Как и Форд, Honda также расширяет тип автомобилей и по-своему реализует метод перемещения.
Переопределение метода является важной особенностью для включения полиморфизма. Используя переопределение метода, подтипы могут изменить способ работы методов, доступных через наследование.
PolymorphismExample.java
Пример вывода полиморфизма:
В основном методе класса PolymorphismExample я создал три объекта - автомобиль, форд и хонду. Все три объекта относятся к типу автомобиля.
Обратите внимание на важный момент: тип суперкласса может ссылаться на тип объекта подкласса, но обратный вариант невозможен. Причина в том, что все члены суперкласса доступны для подкласса с использованием наследования, и во время компиляции компилятор пытается оценить, имеет ли используемый нами ссылочный тип метод, к которому он пытается обратиться.
Так, для ссылок car, f и h в PolymorphismExample, метод move существует из типа Car. Таким образом, компилятор проходит процесс компиляции без каких-либо проблем.
Но когда дело доходит до выполнения во время выполнения, виртуальная машина вызывает методы для объектов, которые являются подтипами. Таким образом, метод move () вызывается из их соответствующих реализаций.
Итак, все объекты относятся к типу Car, но во время выполнения выполнение зависит от объекта, для которого происходит вызов. Это называется полиморфизмом.
источник
Обычно это относится к способности объекта типа A вести себя как объект типа B. В объектно-ориентированном программировании это обычно достигается наследованием. Некоторые ссылки на Википедию, чтобы узнать больше:
РЕДАКТИРОВАТЬ: исправлены неработающие ссылки.
источник
classes have different functionality while sharing a common interface
Полиморфизм такой:
Вы можете передать только Кубок вместо конкретного экземпляра. Это помогает в целом, потому что вам не нужно предоставлять конкретный экземпляр measure () для каждого типа чашки
источник
Я знаю, что это старый вопрос с множеством хороших ответов, но я хотел бы включить один ответ:
Выше приведено множество примеров, демонстрирующих это в действии, но я считаю, что это хороший лаконичный ответ.
источник
(Я просматривал другую статью о чем-то совершенно ином ... и всплыл полиморфизм ... Теперь я подумал, что знаю, что такое полиморфизм ... но, видимо, не так красиво объяснил ... Хотел написать где-нибудь ... лучше еще поделюсь ...)
http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife
читать дальше из этой части:
..... полиморфизм. Это отвратительный способ сказать, что к разным существительным может применяться один и тот же глагол.
источник
Вообще говоря, это возможность взаимодействовать с несколькими различными типами объектов, используя один и тот же или внешне похожий API. Существуют различные формы:
Перегрузка функций: определение нескольких функций с одинаковым именем и разными типами параметров, такими как sqrt (float), sqrt (double) и sqrt (complex). В большинстве языков, которые позволяют это, компилятор автоматически выбирает правильный тип для передаваемого в него аргумента, таким образом, это полиморфизм во время компиляции.
Виртуальные методы в ООП: метод класса может иметь различные реализации, приспособленные к специфике его подклассов; говорят, что каждый из них переопределяет реализацию, заданную в базовом классе. Учитывая объект, который может иметь базовый класс или любой из его подклассов, правильная реализация выбирается на лету, таким образом, это полиморфизм во время выполнения.
Шаблоны: функция некоторых ОО-языков, посредством которой функция, класс и т. Д. Могут параметризоваться по типу. Например, вы можете определить общий шаблонный класс «list», а затем создать его экземпляр как «список целых чисел», «список строк», возможно, даже «список списков строк» или тому подобное. Как правило, вы пишете код один раз для структуры данных произвольного типа элемента, а компилятор генерирует его версии для различных типов элементов.
источник
Термин полиморфизм происходит от:
поли = много
морфизм = способность меняться
В программировании полиморфизм - это «техника», которая позволяет вам «смотреть» на объект как на предмет более чем одного типа. Например:
Объект студента также является объектом личности. Если вы «посмотрите» (то есть на актера) на студента, вы, вероятно, можете попросить студенческий билет. Вы не можете всегда делать это с человеком, верно? (человек не обязательно является студентом, поэтому может не иметь студенческого билета). Однако у человека, вероятно, есть имя. Студент тоже.
В итоге, «взгляд» на один и тот же объект с разных «углов» может дать вам разные «перспективы» (то есть разные свойства или методы)
Таким образом, эта техника позволяет создавать вещи, на которые можно «смотреть» с разных сторон.
Почему мы используем полиморфизм? Для начала ... абстракция. На данный момент должно быть достаточно информации :)
источник
Давайте использовать аналогию. Для данного музыкального сценария каждый музыкант, который его играет, дает свое прикосновение в интерпретации.
Музыкант может быть абстрагирован от интерфейсов, жанр, к которому принадлежит музыкант, может быть абстрактным классом, который определяет некоторые глобальные правила интерпретации, и каждый музыкант, который играет, может быть смоделирован с конкретным классом.
Если вы слушаете музыкальное произведение, у вас есть ссылка на сценарий, например, «Фуга и Токата» Баха, и каждый музыкант, исполняющий его, делает это полиморфно по-своему.
Это всего лишь пример возможного дизайна (на Java):
источник
AnnHalloway
иVictorBorga
чувствую, что они должны быть объектами, а не классами - ваш пример будет лучше читать, например, с помощью.public class Pianist implements Musician
иvictorBorge = new Pianist();
т. д.Я предоставил общий обзор полиморфизма для другого вопроса:
Полиморфизм в с ++
Надеюсь, поможет. Выписка ...
(продолжение в Полиморфизме в C ++ )
источник
Полиморфизм - это способность объекта, которую можно принимать во многих формах. Например, в человеческом классе человек может действовать во многих формах, когда мы говорим об отношениях. Пример: мужчина - отец своего сына, он муж своей жены и учитель своих учеников.
источник
Полиморфизм - это способность объекта принимать различные формы. Наиболее распространенное использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса. В этом примере, написанном на Java, у нас есть три типа транспортных средств. Мы создаем три разных объекта и пытаемся запустить их колеса методом:
Результат:
Для получения дополнительной информации, пожалуйста, посетите https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Я надеюсь, что это помогает.
источник
Полиморфизм - это способность программиста писать методы с одинаковыми именами, которые делают разные вещи для разных типов объектов, в зависимости от потребностей этих объектов. Например, если вы разрабатываете класс с именем
Fraction
и классом с именемComplexNumber
, оба из них могут включать в себя вызываемый методdisplay()
, но каждый из них реализует этот метод по-своему. В PHP, например, вы можете реализовать это так:Выходы:
Некоторые из других ответов, по-видимому, подразумевают, что полиморфизм используется только в сочетании с наследованием; например, возможно,
Fraction
иComplexNumber
оба реализуют абстрактный класс с именем,Number
который имеет методdisplay()
, который затем оба обязаны реализовать Fraction и ComplexNumber. Но вам не нужно наследование, чтобы воспользоваться преимуществами полиморфизма.По крайней мере, в динамически типизированных языках, таких как PHP (я не знаю о C ++ или Java), полиморфизм позволяет разработчику вызывать метод, не зная заранее типа объекта, и полагая, что правильная реализация метода будет называться. Например, скажем, пользователь выбирает тип
Number
созданного:В этом случае
display()
будет вызван соответствующий метод, хотя разработчик не может заранее знать, выберет ли пользователь дробь или комплексное число.источник
В объектно-ориентированном программировании полиморфизм относится к способности языка программирования обрабатывать объекты по-разному в зависимости от их типа данных или класса . Более конкретно, это возможность переопределять методы для производных классов.
источник
Полиморфизм буквально означает, несколько форм. (или много форм): Объект из разных классов и с тем же именем метода, но рабочие процессы разные. Простой пример будет:
Рассмотрим человека X.
Он только один человек, но он действует как многие. Вы можете спросить, как:
Он сын своей матери. Друг своим друзьям. Брат его сестре.
источник
Полиморфизм в ООП означает, что класс может иметь разные типы, наследование является одним из способов реализации полиморфизма.
Например, Shape - это интерфейс, он имеет подтипы Square , Circle , Diamond . теперь у вас есть объект Square, вы можете автоматически переместить квадрат в форму, потому что квадрат - это форма. Но когда вы пытаетесь уменьшить Shape to Square, вы должны выполнить явное приведение типов, потому что вы не можете сказать, что Shape is Square, это может быть и Circle. поэтому вам нужно вручную привести его с кодом, например
Square s = (Square)shape
, что, если форма будет кругом, вы получитеjava.lang.ClassCastException
, потому что круг не квадратный.источник
Полиморфизм:
Ссылочная переменная типа интерфейса может ссылаться на любой из экземпляров класса, которые реализуют этот интерфейс.
источник
Полиморфизм - это способность использовать объект в данном классе, где все компоненты, составляющие объект, наследуются подклассами данного класса. Это означает, что, как только этот объект объявлен классом, все подклассы ниже его (и их подклассы, и так далее, пока вы не достигнете самого дальнего / самого нижнего подкласса) наследуют объект и его компоненты (грим).
Помните, что каждый класс должен быть сохранен в отдельных файлах.
Следующий код иллюстрирует полиморфизм:
Суперкласс:
Отец, подкласс:
Ребенок, другой подкласс:
Метод выполнения ссылается на родительский класс для запуска:
Обратите внимание, что каждый класс должен быть объявлен в отдельных файлах * .java. Код должен скомпилироваться. Также обратите внимание, что вы можете постоянно использовать maidenName и familyTree дальше вниз. Это концепция полиморфизма. Концепция наследования также исследуется здесь, где один класс может быть использован или определяется подклассом.
Надеюсь, что это помогает и проясняет. Я опубликую результаты, когда найду компьютер, который смогу использовать для проверки кода. Спасибо за терпение!
источник
Полиморфизм позволяет одной и той же рутине (функции, методу) воздействовать на разные типы.
Поскольку во многих существующих ответах подтип смешивается с полиморфизмом, существует три способа (включая подтип) для реализации полиморфизма.
Смотрите также:
http://wiki.c2.com/?CategoryPolymorphism
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
источник
В объектно-ориентированных языках полиморфизм позволяет обрабатывать и обрабатывать различные типы данных через один и тот же интерфейс. Например, рассмотрим наследование в C ++: класс B является производным от класса A. Указатель типа A * (указатель на класс A) может использоваться для обработки как объекта класса A, так и объекта класса B.
источник
Полиморфизм в терминах кодирования - это когда ваш объект может существовать в виде нескольких типов посредством наследования и т. Д. Если вы создаете класс с именем «Shape», который определяет количество сторон вашего объекта, то вы можете затем создать новый класс, который наследует его, например, «Квадрат». ». Когда вы впоследствии сделаете экземпляр «Квадрата», вы можете затем повернуть его назад и вперед из «Формы» в «Квадрат», как требуется.
источник
Полиморфизм дает вам возможность создавать один модуль, вызывающий другой, и при этом иметь точку зависимости времени компиляции от потока управления, а не от потока управления.
При использовании полиморфизма модуль высокого уровня не зависит от модуля низкого уровня. Оба зависят от абстракций. Это помогает нам применять принцип инверсии зависимостей ( https://en.wikipedia.org/wiki/Dependency_inversion_principle ).
Вот где я нашел приведенное выше определение. Примерно через 50 минут видео инструктор объясняет вышеизложенное. https://www.youtube.com/watch?v=TMuno5RZNeE
источник
Что такое полиморфизм?
Полиморфизм - это способность:
Вызвать операцию над экземпляром специализированного типа, зная только его обобщенный тип, при вызове метода специализированного типа, а не метода обобщенного типа: это динамический полиморфизм .
Определите несколько методов, имеющих имя сохранения, но имеющих разные параметры: статический полиморфизм .
Первое, если историческое определение и самое главное.
Для чего используется полиморфизм?
Это позволяет создать строго типизированную согласованность иерархии классов и сделать некоторые магические вещи, такие как управление списками объектов разных типов, не зная их типов, а только один из родительских типов, а также привязки данных.
Сильная и слабая типизация
Образец
Вот некоторые фигуры, такие как Point, Line, Rectangle и Circle с операцией Draw (), которая не принимает ничего или параметр для установки времени ожидания для его удаления.
Здесь класс Shape и методы Shape.Draw () должны быть помечены как абстрактные.
Они не для того, чтобы понять.
Explaination
Без полиморфизма, используя abstract-virtual-override, при анализе фигур, только метод Spahe.Draw (), который вызывается как CLR, не знает, какой метод вызывать. Поэтому он вызывает метод типа, с которым мы работаем, и здесь тип является Shape из-за объявления списка. Так что код вообще ничего не делает.
Благодаря полиморфизму CLR может вывести реальный тип объекта, с которым мы работаем, используя так называемую виртуальную таблицу. Так это называют хорошим метод, и здесь вызов Shape.Draw (), если Shape является Point, вызывает Point.Draw (). Таким образом, код рисует фигуры.
Больше чтений
C # - Полиморфизм (Уровень 1)
Полиморфизм в Яве (Уровень 2)
Полиморфизм (Руководство по программированию в C #)
Таблица виртуальных методов
источник