Полиморфизм в программировании - это способность разные объекты использовать одинаково за счет механик наследования, переопределения методов и т.д..
Например у тебя есть 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;