Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по JavaScript на Coddy — урок 35 из 56.

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

В JavaScript полиморфизм чаще всего встречается тогда, когда дочерние классы переопределяют методы родительских классов.

Давайте создадим простой родительский класс с методом speak():

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    return `${this.name} makes a sound`;
  }
}

Теперь давайте создадим дочерний класс, который расширяет Animal:

class Dog extends Animal {
  speak() {
    return `${this.name} barks`;
  }
}

Вот еще один дочерний класс:

class Cat extends Animal {
  speak() {
    return `${this.name} meows`;
  }
}

Каждый дочерний класс реализует метод speak() по-разному. Это полиморфизм в действии!

Теперь мы можем создавать различные объекты и вызывать один и тот же метод для каждого из них:

const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");

console.log(animal.speak()); // Some animal издает звук
console.log(dog.speak());    // Rex лает
console.log(cat.speak());    // Whiskers мяукает

Все три объекта отвечают на метод speak(), но каждый делает это по-своему.

challenge icon

Задание

У вас есть система уведомлений с родительским классом Notification и двумя дочерними классами. Ваша задача — добавить метод send(message) в каждый дочерний класс с различными реализациями.

  1. В классе EmailNotification метод должен возвращать строку: "Sending '(message)' via Email"
  2. В классе SMSNotification метод должен возвращать строку: "Sending '(message)' via SMS"

Шпаргалка

Полиморфизм позволяет объектам разных классов по-разному реагировать на один и тот же метод. В JavaScript это обычно достигается, когда дочерние классы переопределяют методы родительских классов.

Создайте родительский класс с методом:

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    return `${this.name} makes a sound`;
  }
}

Дочерние классы могут переопределять родительский метод своей собственной реализацией:

class Dog extends Animal {
  speak() {
    return `${this.name} barks`;
  }
}

class Cat extends Animal {
  speak() {
    return `${this.name} meows`;
  }
}

Каждый объект по-разному реагирует на один и тот же метод:

const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");

console.log(animal.speak()); // Some animal makes a sound
console.log(dog.speak());    // Rex barks
console.log(cat.speak());    // Whiskers meows

Попробуйте сами

import { EmailNotification } from './email-notification.js';
import { SMSNotification } from './sms-notification.js';

// Тестовый код — не изменять
const email = new EmailNotification();
const sms = new SMSNotification();

console.log(email.send("Hello!"));  // Должен использовать send() из EmailNotification
console.log(sms.send("Hello!"));    // Должен использовать send() из SMSNotification
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование