15 апреля 2024 г. (изменено: 15 апреля 2024 г.)
Канал: @cherkashindev
Полиморфизм
Полиморфизм в программировании — это способность объектов принимать множество форм. Это означает, что один и тот же код может работать с разными типами данных.
Пример 1️⃣
Допустим, мы пишем графический редактор, и нам нужно добавить возможность экспортировать элементы в svg формате (как в excalidraw.com). Напишем метод, который экспортирует массив выделенных элементов в SVG:
interface ISvgItem {
toSvg(): string;
}
function exportToSvg(items: ISvgItem[]) {
return `<svg>${items.map(svg => svg.toSvg()).join('')}</svg>`;
}В данном случае, тот самый объект, который можем принимать множество форм — параметр `items`, так как в этом массиве могут находиться элементы разных типов. Единственное условие — все они должны реализовывать интерфейс ISvgItem.
Реализуем парочку таких типов: круг и квадрат.
class Square implements ISvgItem {
constructor(public side: number, public x: number, public y: number) {
}
toSvg(): string {
return `<rect
x="${this.x}"
y="${this.y}"
width="${this.side}"
height="${this.side}"
/>`;
}
}
class Circle implements ISvgItem {
constructor(public radius: number, public x: number, public y: number) { }
toSvg(): string {
return `<circle x="${this.x}" y="${this.y}" r="${this.radius}" />`;
}
}Наш метод exportToSvg может работать с экземплярами обоих классов:
exportToSvg([
new Square(40, 10, 10),
new Circle(25, 10, 15),
])В этом примере, когда код работает с объектами, он не знает точно, какой объект будет передан в качестве параметра. Но он точно знает, что у объекта будет метод toSvg(), это и есть полиморфизм.
Пример 2️⃣
Ваше приложение может работать как с PostgreSQL, так и с MSSQL, всё зависит от конфигурации, которую задал пользователь.
В таком случае мы выделяем абстракцию (абстрактный класс или интерфейс) DataBaseConnection, и всё приложение работает именно с этой абстракцией, а не с конкретной реализацией.
В таком случае создаваться DataBaseConnection скорее всего будет с помощью паттерна “фабрика”, но об этом как-нибудь в другой раз.
📌 Я бы сказал, что полиморфизм — это логическое продолжение абстракции, без которого невозможно было бы реализовать большинство паттернов проектирования.