JavaScript - Полиморфизм

Здравствуйте, будущие маги JavaScript! Сегодня мы отправимся в увлекательное путешествие в мир полиморфизма в JavaScript. Не волнуйтесь, если это слово звучит пугающе — к концу этого урока вы будете использовать полиморфизм, как профессионал!

JavaScript - Polymorphism

Полиморфизм в JavaScript

Давайте начнем с азов. Полиморфизм — это модное слово, пришедшее из греческого, что означает "много форм". В программировании он refers к способности объектов принимать несколько форм или поведений. Представьте себе хамелеона, который меняет свой цвет, чтобы адаптироваться к разным средам.

В JavaScript полиморфизм позволяет нам использовать один интерфейс для представления разных типов объектов. Это как универсальный пульт дистанционного управления, который может управлять различными устройствами — вашим телевизором, DVD-плеером и аудиосистемой — всеми с одними и теми же кнопками.

Вот простой пример для проиллюстрирования этой концепции:

function makeSound(animal) {
console.log(animal.sound());
}

let dog = {
sound: function() {
return "Woof!";
}
};

let cat = {
sound: function() {
return "Meow!";
}
};

makeSound(dog); // Вывод: Woof!
makeSound(cat); // Вывод: Meow!

В этом примере у нас есть функция makeSound, которая может работать с разными объектами животных. Both dog и cat имеют метод sound, но они производят разные Outputs. Это и есть полиморфизм в действии!

Переопределение методов

Одним из ключевых аспектов полиморфизма является переопределение методов. Это occurs, когда дочерний класс предоставляет конкретную реализацию метода, уже определенного в его родительском классе.

Давайте рассмотрим пример:

class Animal {
makeSound() {
return "The animal makes a sound";
}
}

class Dog extends Animal {
makeSound() {
return "The dog barks";
}
}

class Cat extends Animal {
makeSound() {
return "The cat meows";
}
}

let animal = new Animal();
let dog = new Dog();
let cat = new Cat();

console.log(animal.makeSound()); // Вывод: The animal makes a sound
console.log(dog.makeSound());    // Вывод: The dog barks
console.log(cat.makeSound());    // Вывод: The cat meows

Здесь у нас есть класс Animal с методом makeSound. Классы Dog и Cat наследуют Animal и переопределяют метод makeSound своими собственными реализациями. Это позволяет каждому животному иметь свой уникальный звук, оставаясь частью семьи Animal.

Примеры

Давайте углубимся с помощью больше примеров, чтобы действительно укрепить наше понимание полиморфизма в JavaScript.

Пример 1: Калькулятор фигур

Представьте, что мы создаем калькулятор фигур. Мы хотим вычислить площадь разных фигур, используя одно и то же имя метода.

class Shape {
calculateArea() {
return 0;
}
}

class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
}

calculateArea() {
return Math.PI * this.radius * this.radius;
}
}

class Rectangle extends Shape {
constructor(width, height) {
super();
this.width = width;
this.height = height;
}

calculateArea() {
return this.width * this.height;
}
}

function printArea(shape) {
console.log("The area is: " + shape.calculateArea());
}

let circle = new Circle(5);
let rectangle = new Rectangle(4, 6);

printArea(circle);    // Вывод: The area is: 78.53981633974483
printArea(rectangle); // Вывод: The area is: 24

В этом примере у нас есть базовый класс Shape и два производных класса, Circle и Rectangle. Каждый класс реализует свой метод calculateArea. Функция printArea может работать с любым объектом фигуры, демонстрируя полиморфизм.

Пример 2: Система расчета заработной платы сотрудников

Давайте создадим простую систему расчета заработной платы сотрудников, чтобы further проиллюстрировать полиморфизм:

class Employee {
constructor(name, salary) {
this.name = name;
this.salary = salary;
}

calculateBonus() {
return this.salary * 0.1;
}
}

class Manager extends Employee {
calculateBonus() {
return this.salary * 0.2;
}
}

class Developer extends Employee {
calculateBonus() {
return this.salary * 0.15;
}
}

function printBonus(employee) {
console.log(`${employee.name}'s bonus is: $${employee.calculateBonus()}`);
}

let john = new Employee("John", 50000);
let jane = new Manager("Jane", 70000);
let bob = new Developer("Bob", 60000);

printBonus(john); // Вывод: John's bonus is: $5000
printBonus(jane); // Вывод: Jane's bonus is: $14000
printBonus(bob);  // Вывод: Bob's bonus is: $9000

В этом примере у нас есть разные типы сотрудников с различными правилами расчета бонусов. Функция printBonus работает с любым объектом сотрудника, показывая полиморфизм.

Преимущества использования полиморфизма в JavaScript

Теперь, когда мы видели полиморфизм в действии, давайте поговорим о том, почему он так awesome:

  1. Повторное использование кода: Полиморфизм позволяет нам писать более общие и повторно используемые фрагменты кода. Наши функции printArea и printBonus могут работать с любым объектом фигуры или сотрудника respectively.

  2. Гибкость: Добавление новых типов объектов становится легче без изменения существующего кода. Мы могли бы добавить класс Triangle к нашему калькулятору фигур, не изменяя функцию printArea.

  3. Удобство обслуживания: Полиморфизм может привести к более чистому, более организованному коду, который легче обслуживать и расширять.

  4. Абстракция: Он позволяет нам работать с объектами на более высоком уровне абстракции, сосредотачиваясь на том, что делают объекты, а не на том, как они это делают.

Вот таблица, резюмирующая ключевые методы, которые мы использовали в наших примерах:

Метод Описание
calculateArea() Вычисляет площадь фигуры
calculateBonus() Вычисляет бонус для сотрудника
makeSound() Возвращает звук, который издает животное
sound() Возвращает звук, который издает животное (в примере с объектной литерал)

Помните,年轻的 падаваны, полиморфизм — это как швейцарский армейский нож в вашем наборе для программирования. Он универсален, мощен и может сделать ваш код более изящным и эффективным. Продолжайте практиковаться, и скоро вы будете использовать полиморфизм, чтобы достичь мастерства в JavaScript!

Credits: Image by storyset