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

«Что такое полиморфизм в ООП?» — вопрос из категории ООП, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Полиморфизм — это принцип объектно-ориентированного программирования, позволяющий объектам с разной внутренней реализацией обрабатываться через единый интерфейс. В контексте Node.js и JavaScript/TypeScript это реализуется несколькими способами:

  1. Переопределение методов (динамический полиморфизм): Дочерний класс может переопределить метод родительского класса.

    class Logger {
      log(message) {
        console.log(`[LOG]: ${message}`);
      }
    }
    
    class FileLogger extends Logger {
      log(message) {
        // Переопределение: логирование в файл вместо консоли
        const fs = require('fs');
        fs.appendFileSync('app.log', `${message}n`);
      }
    }
    
    const logger = new FileLogger();
    logger.log('User logged in'); // Вызовется метод FileLogger.log
  2. Полиморфизм на основе интерфейсов (в TypeScript): Разные классы, реализующие один интерфейс, могут использоваться взаимозаменяемо.

    interface DataStorage {
      save(data: string): void;
    }
    
    class DatabaseStorage implements DataStorage {
      save(data: string) {
        // Логика сохранения в БД, например, с использованием Prisma или Mongoose
        console.log(`Saving to DB: ${data}`);
      }
    }
    
    class CloudStorage implements DataStorage {
      save(data: string) {
        // Логика отправки в облако (AWS S3, Google Cloud Storage)
        console.log(`Uploading to cloud: ${data}`);
      }
    }
    
    function processData(storage: DataStorage, data: string) {
      // Функция работает с любым объектом, реализующим DataStorage
      storage.save(data);
    }
    
    processData(new DatabaseStorage(), 'record1');
    processData(new CloudStorage(), 'record2');

Практическая польза в Node.js: Полиморфизм позволяет создавать гибкие и расширяемые системы, например, подключать разные стратегии кэширования (Redis, Memcached, in-memory), различные провайдеры аутентификации или адаптеры для баз данных через единый контракт, что упрощает тестирование и поддержку.

Видео-ответы