@gooooooose

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

Добрый день! Подскажите пожалуйста, что такое полиморфизм простыми словами.... облазил кучу сайтов и форумов и толком не понял, что же такое полиморфизм. Буду весьма благодарен, если к объяснению будет прикреплен пример на Ruby.
  • Вопрос задан
  • 265 просмотров
Пригласить эксперта
Ответы на вопрос 4
vitaly_74
@vitaly_74
Поли - много, морф - форма. (поправьте если что)
представь у тебя есть бэк и фронт.
фронт общается с бэком посредством апи.
а теперь представь вместо бэка на php подставить бэк на ruby (или на чем нибудь другом).
а фронт останется таким же. Так вот чтобы обеспечить четкую работу фронта, при смене языка программирования, фронт и бэк должны общаться по некоторому "контракту", т.е. если я запрашиваю с фронта на бэке корзину товаров, то ответ всегда должен содержать одни и теже поля (но например могут быть разные значения).
Полиморфизм связан с таким понятием как "контракт" в программирование - это интерфейсы.
Перейдем к примеру из программирования.
Представим что бизнес требует сегодня подключить платежную систему например эпл пей, для проведения оплаты например методом makePay()
Далее через неделю бизнес решает перейти на google и ты делаешь также реализацию makePay() для гугла.
А затем к тебе еще раз приходит бизнес и говорит "нам нужно снова работать с эплом. Тогда Ты просто меняешь в клиентском коде объект GooglePay() на ApplePay() и у тебя все работает.
Это и называется полиморфизм.
У тебя 2 класса, работают по одному контракту (интерфейсу) в котором записано, что объект который исплементирует данный интерфейс должен уметь выполнять makePay();
и вот через 3 месяца к тебе еще раз приходит бизнес и говорит давайка поменяй нам платежную систему на binanePay(). ну собственно, ты создаешь одноименный класс, имплементируешь туда интерфейс с makePay() и в клиенстком коде просто меняешь ApplePay на BinancePay и теперь бизнес уже работает не с эплом а с бинанс.
т.е. Полиморфизм дает возможность заменить один объект на другой.
Ответ написан
@AlexSku
не буду отвечать из-за модератора
На Haskell видел такие примеры:
1) хотите описать функцию для аргументов разных типов. Напр., len x определит длину списка (количество элементов) любых объектов (Int, Bool, String...)
2) при функции сложения (оператор +) для целых чисел вызывается одна внутренняя функция, а для дробных - другая (они скрыты от пользователя).
Ответ написан
Комментировать
GavriKos
@GavriKos
Когда одна сущность успешно прикидывается другой сущностью.
Ответ написан
Комментировать
HemulGM
@HemulGM
Delphi Developer, сис. админ
Полиморфизм в программировании - это способность разные объекты использовать одинаково за счет механик наследования, переопределения методов и т.д..

Например у тебя есть 3 класса описывающие разные сущности. Например, объект "новость", "бревно" и "картина". А ты хочешь вывести их в один список, да так чтобы показать более менее понятно, а не просто "новость 1" / "бревно 34".

Для этого ты создаешь базовый класс, от которого наследуешь эти 3 класса и создаешь в нём абстрактный метод "описание". Теперь каждый класс должен будет реализовать этот метод (или может использовать родительскую реализацию, если создавать не абстрактный метод, а виртуальный) и по-своему выдать описание конкретного объекта. Примерно так же это реализуется через интерфейсы (interface).

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

На Ruby примера нет, могу на Delphi (Pascal)
// Базовый класс для всех элементов
  TBaseItem = class
    // Наш метод, который позволяет получать описание объекта
    function GetDescription: string; virtual; abstract;
  end;

  // Класс картины
  TPicture = class(TBaseItem)
    // Свой метод получения описания картины
    function GetDescription: string; override;
  end;

  // Класс бревна
  TLog = class(TBaseItem)
    // Свой метод получения описания бревна
    function GetDescription: string; override;
  end;

  // Класс новости
  TNews = class(TBaseItem)
    // Свой метод получения описания новости
    function GetDescription: string; override;
  end;

  // Класс списка наших элементов, где каждый элемент имеет методы и поля базового класса TBaseItem
  TItems = class(TList<TBaseItem>);

  ...
  // Наш заполненый список, где у нас могут быть новости, бревна и прочие объекты на основе класса TBaseItem
  var Items: TItems;

  // Теперь мы можем пройтись по списку и получить описание всех объектов
  for var Item in Items do
    var Desc := Item.GetDescription;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы