Что такое полиморфизм?
Часть раздела Объектно-ориентированное программирование путешествия по 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(), но каждый делает это по-своему.
Задание
У вас есть система уведомлений с родительским классом Notification и двумя дочерними классами. Ваша задача — добавить метод send(message) в каждый дочерний класс с различными реализациями.
- В классе
EmailNotificationметод должен возвращать строку: "Sending '(message)' via Email" - В классе
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Объекты и ключевое слово this
Краткий обзор: ОбъектыДобавление методов в объектыПонимание ключевого слова thisФункции-конструкторыКлючевое слово newИтоговое испытание7Наследование и ключевое слово extends
НаследованиеОтношение «is-a»Ключевое слово extendsМетод super()Наследование свойств и методовИтоговое испытание10Полиморфизм
Что такое полиморфизм?Переопределение унаследованных методовИспользование superИтоговое задание13Композиция против наследования
Отношения «has-a» и «is-a»Ограничения глубокого наследованияСоздание объектов2Организация кода
Что такое модули?Экспорт с помощью exportИмпорт с помощью importDefault против именованных экспортов5Инкапсуляция и доступ
ИнкапсуляцияПубличные и приватные поля классовПриватные методыЗадание на повторение8Организация кода ООП
Организация классов в модули11Проект: Отрисовщик фигур
Настройка: Класс Shape и экспортНаследование класса Circle14Система управления библиотекой
Проектирование библиотекиКласс Book с использованием композиции6Проект: Простой банковский счет
Класс BankAccountПополнение и снятие средств9Статические методы и свойства
Уровень класса против уровня экземпляраСтатические свойстваСтатические вспомогательные методыЗадание на закрепление