15 апреля 2024 г. (изменено: 15 апреля 2024 г.)

Канал: @cherkashindev

1 155

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

Полиморфизм в программировании — это способность объектов принимать множество форм. Это означает, что один и тот же код может работать с разными типами данных.

Пример 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 скорее всего будет с помощью паттерна “фабрика”, но об этом как-нибудь в другой раз.

📌 Я бы сказал, что полиморфизм — это логическое продолжение абстракции, без которого невозможно было бы реализовать большинство паттернов проектирования.

👍 9 5 🔥 4