Что такое полиморфизм, для чего он используется и как он используется?

Что такое полиморфизм, для чего он нужен и как он используется?

Ответ 1

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

  • Поли = много: многоangularьник = многогранно, полистирол = много стиролов (a), полиглот = много языков и т.д.
  • Морф = изменение или форма: морфология = изучение биологической формы, Морфеус = греческий бог снов, способный принимать любую форму.

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

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

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

Классическим примером является класс Shape и все классы, которые могут наследовать от него (квадрат, круг, додекаэдр, неправильный многоangularьник, сплат и т.д.).

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

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

shape.Draw()

чтобы получить правильное поведение для любой фигуры.

Это в отличие от старого способа делать вещи, в которых код был отделен от данных, и у вас были бы такие функции, как drawSquare() и drawCircle().

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


(a) Первоначально я написал это как шутку, но она оказалась правильной и, следовательно, не такой уж смешной. Мономер стирола получается из углерода и водорода C8H8, а полистирол из его групп (C8H8)n.

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

Иногда вы должны просто выйти, пока вы позади :-)

Ответ 2

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

Вот пример в С#. Создайте четыре класса в консольном приложении:

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

Теперь создайте следующее в Main() модуля для консольного приложения:

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

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

Затем добавим велосипед, автомобиль и грузовик в список.

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

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

Я надеюсь, что это поможет вам.

Ответ 3

Из Понимание и применение полиморфизма в PHP, спасибо Стиву Руидти.

Полиморфизм - это длинное слово для очень простой концепции.

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

Красота полиморфизма заключается в том, что код, работающий с разными классами, не должен знать, какой класс он использует, поскольку все они используются одинаково. Аналогом реального мира для полиморфизма является кнопка. Всем известно, как использовать кнопку: вы просто нажимаете на нее. Однако кнопка "делает" зависит от того, с чем она связана, и от контекста, в котором она используется, но результат не влияет на ее использование. Если ваш босс говорит вам нажимать кнопку, у вас уже есть вся информация, необходимая для выполнения задачи.

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

Ответ 4

Если кто-нибудь скажет CUT этим людям

  • Хирург
  • Стилист для волос
  • Актер

Что произойдет?

  • Хирург начнет делать надрез.
  • Парикмахер начнет резать кому-то волосы.
  • Актер внезапно прекратит выступать из текущей сцены, ожидая директивного руководства.

Итак, выше представления показывает, что в ООП есть полиморфизм (то же имя, другое поведение).

Если вы собираетесь на собеседование, а интервьюер просит вас рассказать/показать живой пример полиморфизма в той же комнате, мы сидим, скажем -

Ответ - дверь /Windows

Интересно, как?

Через дверь/окно - человек может прийти, может наступить воздух, может наступить свет, может наступить дождь и т.д.

Чтобы понять это лучше и простым способом, я использовал пример выше.. Если вам нужна ссылка для кода, следуйте приведенным выше ответам.

Ответ 5

Простое объяснение по аналогии

Президент США использует полиморфизм. Как? Ну, у него много советников:

  1. Военные советники
  2. Юрисконсульты
  3. Ядерные физики (в качестве советников)
  4. Медицинские консультанты
  5. и т.д.

Каждый должен нести ответственность только за одну вещь: Пример:

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

То же самое с кодом: проблемы и обязанности должны быть разделены между соответствующими классами/людьми. В противном случае вы бы сделали так, чтобы президент знал буквально все в мире - всю Википедию. Представьте себе, что в вашем коде есть вся википедия: поддерживать ее было бы кошмаром.

Почему это плохая идея для президента знать все эти конкретные вещи?

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

Например, если EPA изменит законы о загрязнении, то когда это произойдет: вам нужно будет изменить класс EPA , а также класс Президента. Изменение кода в двух местах, а не в одном, может быть опасным, потому что его гораздо сложнее поддерживать.

Есть ли лучший подход?

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

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

Пример - использования полиморфного подхода:

Все, что президент делает, это просит людей посоветовать ему - и то, что он на самом деле делает в реальной жизни - и то, что должен делать хороший президент. все его советники реагируют по-разному, но все они знают, что президент имеет в виду: Advise(). В его кабинет стекались сотни людей. На самом деле не имеет значения, кто они. Все, что президент знает, это то, что, когда он просит их "посоветовать", они знают, как реагировать соответствующим образом:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        condolezza.Advise(); // # she says negotiate trade deal with Iran
        healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

Такой подход позволяет президенту управлять страной буквально, не зная ничего о военной технике, здравоохранении или международной дипломатии: детали оставлены на усмотрение экспертов. Единственное, что нужно знать президенту, это: "Advise()".

То, что вы не хотите:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

НЕТ! НЕТ! НЕТ! В вышеупомянутом сценарии президент делает всю работу: он знает об увеличении численности войск и уже существующих условиях. Это означает, что если ближневосточная политика изменится, то президент должен будет изменить свои команды, а также класс Петреуса. Нам нужно только изменить класс Петреуса, потому что президенту не нужно увязать в таких деталях. Ему не нужно знать о деталях. Все, что ему нужно знать, это то, что если он сделает один заказ, обо всем позаботятся. Все детали должны быть оставлены на усмотрение экспертов.

Это позволяет президенту делать то, что он делает лучше всего: устанавливать общую политику, хорошо выглядеть и играть в гольф: P.

Как это на самом деле реализовано - через базовый класс или общий интерфейс

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

Другими словами, Petraeus, Condi и HealthOfficials будут классами, которые "реализуют интерфейс" - пусть назовем его интерфейсом IAdvisor, который содержит только один метод: Advise(). Но теперь мы углубляемся в специфику.

Это было бы идеально

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials,
            //  Petraeus etc. The president has no idea who it will 
            // be. But he does know that he can ask them to "advise" 
            // and that all Mr Prez cares for.

        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

Резюме

Все, что вам действительно нужно знать, это:

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

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

Ответ 6

Полиморфизм - это способность обрабатывать класс объекта, как если бы он был родительским классом.

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

Dog* dog = new Dog;
Animal* animal = dog;

Ответ 7

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

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

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

  • Так же, как поля структуры C находятся в защищенном пространстве имен, поэтому являются переменными экземпляра объектов.

  • Имена методов также защищены. В отличие от имен функций C, имена методов arent global symbols. Имя метода в одном класс не может конфликтовать с именами методов в других классах; два очень разные классы могут реализовать одинаково названные методы.

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

Основное преимущество полиморфизма заключается в том, что он упрощает интерфейс программирования. Это позволяет устанавливать соглашения, которые могут быть повторно использованы в классе после класса. Вместо того, чтобы изобретать новое имя для каждой новой функции, которую вы добавляете в программу, одни и те же имена можно использовать повторно. Интерфейс программирования можно охарактеризовать как набор абстрактных поведений, не говоря уже о классах, которые их реализуют.

<сильные > Примеры:

Пример-1: Вот простой пример, написанный в Python 2.x.

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

Пример-2: Полиморфизм реализован в Java с использованием методов перегрузки и метода переопределения. p >

Рассмотрим пример автомобиля для обсуждения полиморфизма. Возьмите любой бренд, такой как Ford, Honda, Toyota, BMW, Benz и т.д., Все типа автомобиля.

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

Теперь создадим базовый тип Car

Car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

Приведем пример Ford Car.

Форд расширяет тип Car, чтобы наследовать все его элементы (свойства и методы).

Ford.java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

Вышеупомянутый класс Ford расширяет класс Car, а также реализует метод move(). Несмотря на то, что метод перемещения уже доступен Форду через Наследование, Ford по-прежнему реализовал метод по-своему. Это называется переопределением метода.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Как и Ford, Honda также расширяет тип автомобиля и применяет метод перемещения по-своему.

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

PolymorphismExample.java

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

Результат вывода полиморфизма:

В основном методе класса PolymorphismExample я создал три объекта: автомобиль, Ford и Honda. Все три объекта относятся к типу автомобиля.

Обратите внимание на важный момент здесь, что тип суперкласса может относиться к типу объекта класса Sub, но наоборот. Причина в том, что все члены суперкласса доступны для подкласса с использованием наследования и во время компиляции компилятор пытается оценить, использует ли ссылочный тип метод, к которому он пытается получить доступ.

Итак, для ссылок car, f и h в примере PolymorphismExample метод перемещения существует из типа Car. Таким образом, компилятор передает процесс компиляции без каких-либо проблем.

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

Итак, все объекты имеют тип Car, но во время выполнения выполнение зависит от объекта, на котором происходит вызов. Это называется полиморфизмом.

Ответ 8

Обычно это относится к способности объекта типа A вести себя как объект типа B. В объектно-ориентированном программировании это обычно достигается путем наследования. Некоторые ссылки в Википедии для чтения:

EDIT: исправлены неработающие ссылки.

Ответ 9

Полиморфизм таков:

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

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

Ответ 10

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

Обработка производного типа, как если бы он был базовым.

Есть много примеров выше, которые показывают это в действии, но я считаю, что это хороший краткий ответ.

Ответ 11

(Я просматривал еще одну статью о чем-то совершенно другом.. и появился полиморфизм... Теперь я подумал, что знаю, что такое Полиморфизм... но, видимо, не так красиво объяснено. Хотел записать его где-то... лучше все равно поделюсь им...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

читайте в этой части:

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

Ответ 12

Вообще говоря, это способность взаимодействовать с несколькими различными типами объектов с использованием того же или внешне аналогичного API. Существуют различные формы:

  • Перегрузка функций: определение нескольких функций с одинаковым именем и разными типами параметров, таких как sqrt (float), sqrt (double) и sqrt (complex). В большинстве языков, которые позволяют это, компилятор автоматически выберет правильный для типа передаваемого в него аргумента, таким образом, это полиморфизм времени компиляции.

  • Виртуальные методы в ООП: метод класса может иметь различные реализации, адаптированные к специфике его подклассов; каждый из них, как говорят, переопределяет реализацию, данную в базовом классе. Учитывая объект, который может быть базового класса или любого из его подклассов, правильная реализация выбирается "на лету", поэтому это полиморфизм во время выполнения.

  • Шаблоны: функция некоторых языков OO, посредством которых функция, класс и т.д. могут быть параметризованы типом. Например, вы можете определить общий шаблон шаблона "список", а затем создать его как "список целых чисел", "список строк", возможно, даже "список списков строк" ​​или тому подобное. Как правило, один раз вы пишете код для структуры данных произвольного типа элемента, а компилятор генерирует его версии для различных типов элементов.

Ответ 13

Термин полиморфизм происходит от:

poly = many

морфизм = способность изменять

В программировании полиморфизм - это "техника", которая позволяет "смотреть" на объект как нечто большее, чем одно. Например:

Объект-ученик также является объектом-человеком. Если вы "посмотрите" (то есть набросок) на ученика, вы, возможно, можете запросить идентификатор студента. Вы не всегда можете сделать это с человеком, не так ли? (человек не обязательно является студентом, поэтому у него может не быть студенческого удостоверения). Однако у человека, вероятно, есть имя. Студент тоже.

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

Таким образом, этот метод позволяет создавать вещи, которые можно "смотреть" под разными углами.

Почему мы используем полиморфизм? Для начала... абстракция. На этом этапе должно быть достаточно информации:)

Ответ 14

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

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

Если вы слушатель музыкальной работы, у вас есть ссылка на script например. Бах 'Фуга и Токата', и каждый музыкант, который его выполняет, делает это полиморфно по-своему.

Это всего лишь пример возможного дизайна (на Java):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}

Ответ 15

Я представил общий обзор полиморфизма на высоком уровне по другому вопросу:

Полиморфизм в С++

Надеюсь, это поможет. Экстракт...

... это помогает начать с простого теста для него и определения [полиморфизма]. Рассмотрим код:

Type1 x;
Type2 y;

f(x);
f(y);

Здесь f() должен выполнить некоторую операцию и в качестве входных данных заданы значения x и y. Чтобы быть полиморфным, f() должен иметь возможность работать со значениями по меньшей мере двух разных типов (например, int и double), находить и выполнять код, соответствующий типу.

(продолжение в Полиморфизм в С++)

Ответ 16

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

Ответ 17

Полиморфизм - это способность объекта принимать различные формы. Наиболее частое использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса. В этом примере, написанном на Java, у нас есть три типа транспортных средств. Мы создаем три разных объекта и пытаемся запустить их методы:

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

Результат:

Результат

Для получения дополнительной информации посетите https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java. Я надеюсь, что это помогает.

Ответ 18

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

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

Выходы:

This is a fraction: 1/2
This is a complex number: 1 + 2i

Некоторые из других ответов, по-видимому, подразумевают, что полиморфизм используется только в сочетании с наследованием; например, возможно, Fraction и ComplexNumber оба реализуют абстрактный класс с именем Number, который имеет метод display(), который обеим обязательным образом реализуют Fraction и ComplexNumber. Но вам не нужно наследование, чтобы воспользоваться полиморфизмом.

По крайней мере, на динамически типизированных языках, таких как PHP (я не знаю о С++ или Java), полиморфизм позволяет разработчику вызывать метод, не зная заранее тип объекта, и полагая, что правильная реализация метод будет вызван. Например, скажем, пользователь выбирает тип Number, созданный:

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user number is: ";
$userNumber->display();
echo "\n";

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

Ответ 19

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

Ответ 20

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

Разное выполнение в зависимости от экземпляра класса, а не типа ссылочной переменной.

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

Ответ 21

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

Рассмотрим человека X.

Он всего лишь один человек, но он действует как много. Вы можете спросить, как:

Он сын своей матери. Друг своим друзьям. Брат его сестре.

Ответ 22

Полиморфизм в ООП означает, что класс может иметь разные типы, наследование является одним из способов реализации полиморфизма.

например, Форма - это интерфейс, он имеет подтипы Квадратный, Круг, Алмаз. теперь у вас есть объект Square, вы можете автоматически увеличивать квадрат до формы, потому что Square - это форма. Но когда вы пытаетесь склонить Shape to Square, вы должны делать явное титье, потому что вы не можете сказать, что Shape is Square, это может быть Circle. поэтому вам нужно вручную набросить его с помощью кода типа Square s = (Square)shape, что если форма Circle, вы получите java.lang.ClassCastException, потому что Circle не является квадратом.

Ответ 23

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

Помните, что каждый класс должен быть сохранен в отдельных файлах.

Следующий код иллюстрирует полиморфизм:

SuperClass:

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

Отец, подкласс:

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

Ребенок, другой подкласс:

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

Метод выполнения, ссылки Родительский класс для запуска:

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

Обратите внимание, что каждый класс должен быть объявлен в отдельных *.java файлах. Код должен компилироваться. Также обратите внимание, что вы можете постоянно использовать maidenName и familyTree дальше. Такова концепция полиморфизма. Концепция наследования также изучается здесь, где один класс может быть использован или дополнительно определен подклассом.

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

Ответ 24

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

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

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

См. также:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

Ответ 25

В объектно-ориентированных языках полиморфизм позволяет обрабатывать и обрабатывать разные типы данных через один и тот же интерфейс. Например, рассмотрим наследование в С++: Класс B получен из класса A. Указатель типа A * (указатель на класс A) может использоваться для обработки как объекта класса A, так и объекта класса B.

Ответ 26

Эта статья wikipedia имеет хорошие примеры на многих языках.

Ответ 27

Полиморфизм в терминах кодирования - это когда ваш объект может существовать как несколько типов через наследование и т.д. Если вы создадите класс с именем "Shape", который определяет количество сторон вашего объекта, тогда вы можете создать новый класс, который наследует его как "Квадрат". Когда вы впоследствии создадите экземпляр "Квадрата", вы можете отбросить его назад и вперед от "Shape" до "Square" по мере необходимости.

Ответ 28

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

Используя полиморфизм, модуль высокого уровня не зависит от модуля низкого уровня. Оба зависят от абстракций. Это помогает нам применить принцип инверсии зависимостей (https://en.wikipedia.org/wiki/Dependency_inversion_principle).

Здесь я нашел указанное выше определение. Примерно через 50 минут на видео инструктор объясняет это выше. https://www.youtube.com/watch?v=TMuno5RZNeE

Ответ 29

Что такое полиморфизм?

Полиморфизм - это способность:

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

  • Определите несколько методов, имеющих имя сохранения, но имеющих разные параметры: это статический полиморфизм.

Первое, если историческое определение и самое важное.

Для чего используется полиморфизм?

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

Сильная и слабая типизация

образец

Вот некоторые фигуры, такие как Point, Line, Rectangle и Circle с операцией Draw(), которая не принимает ничего или параметр для установки тайм-аута для его удаления.

public class Shape
{
 public virtual void Draw()
 {
   DoNothing();
 }
 public virtual void Draw(int timeout)
 {
   DoNothing();
 }
}

public class Point : Shape
{
 int X, Y;
 public override void Draw()
 {
   DrawThePoint();
 }
}

public class Line : Point
{
 int Xend, Yend;
 public override Draw()
 {
   DrawTheLine();
 }
}

public class Rectangle : Line
{
 public override Draw()
 {
   DrawTheRectangle();
 }
}

var shapes = new List<Shape> { new Point(0,0), new Line(0,0,10,10), new rectangle(50,50,100,100) };

foreach ( var shape in shapes )
  shape.Draw();

Здесь класс Shape и методы Shape.Draw() должны быть помечены как абстрактные.

Они не для того, чтобы понять.

Explaination

Без полиморфизма, используя abstract-virtual-override, при анализе фигур, только метод Spahe.Draw(), который вызывается как CLR, не знает, какой метод вызывать. Поэтому он вызывает метод типа, с которым мы работаем, и здесь тип является Shape из-за объявления списка. Так что код вообще ничего не делает.

С полиморфизмом CLR может выводить реальный тип объекта, с которым мы работаем, используя так называемую виртуальную таблицу. Поэтому он вызывает хороший метод, и здесь вызов Shape.Draw(), если Shape является Point, вызывает Point.Draw(). Таким образом, код рисует формы.

Больше чтений

С# - Полиморфизм (Уровень 1)

Полиморфизм в Java (уровень 2)

Полиморфизм (Руководство по программированию в С#)

Таблица виртуальных методов