Подтвердить что ты не робот

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

Я прочитал некоторые возможные статьи, которые я мог найти в Интернете о полиморфизме. Но я думаю, что не мог полностью понять значение этого и его важность. В большинстве статей не говорится, почему это важно и как я могу достичь полиморфного поведения в ООП (конечно, в JavaScript).

Я не могу предоставить пример кода, потому что у меня нет идеи, как его реализовать, поэтому мои вопросы приведены ниже:

  1. Что это?
  2. Зачем нам это нужно?
  3. Как это устроено?
  4. Как я могу добиться этого полиморфного поведения в JavaScript?

У меня есть этот пример. Но легко понять, каким будет результат этого кода. Это не дает четкого представления о самом полиморфизме.

function Person(age, weight) {
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo.";
    }
}
function Employee(age, weight, salary) {
    this.salary = salary;
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo " +
        "and earns " + this.salary + " dollar.";
    }
}

Employee.prototype = new Person();
Employee.prototype.constructor = Employee;
  // The argument, 'obj', can be of any kind
  // which method, getInfo(), to be executed depend on the object
  // that 'obj' refer to.

function showInfo(obj) {
    document.write(obj.getInfo() + "<br>");
}

var person = new Person(50,90);
var employee = new Employee(43,80,50000);
showInfo(person);
showInfo(employee);
4b9b3361

Ответ 1

Полиморфизм является одним из принципов объектно-ориентированного программирования (ООП). Это практика проектирования объектов для совместного использования поведения и возможности переопределять общие поведения с конкретными. Полиморфизм использует преимущество наследования, чтобы это произошло.

В ООП все считается моделированным как объект. Эта абстракция может быть доведена до гаек и болтов для автомобиля или такая же широкая, как просто тип автомобиля с годами, моделью и моделью.

Чтобы иметь сценарий с полиморфным автомобилем, был бы тип базового автомобиля, а затем были бы подклассы, которые унаследовали бы от автомобиля и обеспечили бы собственное поведение поверх основных моделей поведения, которые мог бы иметь автомобиль. Например, подкласс может быть TowTruck, который все еще будет иметь год изготовления и модель, но может также иметь некоторые дополнительные поведения и свойства, которые могут быть такими же основными, как флаг для IsTowing, столь же сложный, как и особенности лифта.

Возвращаясь к примеру людей и сотрудников, все сотрудники - это люди, но все люди не являются сотрудниками. Это значит, что люди будут суперклассами, а работники - подклассом. Люди могут иметь возраст и вес, но у них нет зарплаты. Сотрудники - это люди, поэтому они будут иметь возраст и вес, но также потому, что они являются сотрудниками, у них будет зарплата.

Итак, чтобы облегчить это, мы сначала выпишем суперкласс (Person)

function Person(age,weight){
 this.age = age;
 this.weight = weight;
}

И мы предоставим Человеку возможность поделиться своей информацией.

Person.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo.";
};

Далее мы хотим иметь подкласс Person, Employee

function Employee(age,weight,salary){
 this.age = age;
 this.weight = weight;
 this.salary = salary;
}
Employee.prototype = new Person();

И мы переопределим поведение getInfo, указав тот, который более подходит для Employee

Employee.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo " +
    "and earns " + this.salary + " dollar.";  
};

Они могут использоваться аналогично использованию вашего исходного кода

var person = new Person(50,90);
var employee = new Employee(43,80,50000);

console.log(person.getInfo());
console.log(employee.getInfo());

Тем не менее, наследования здесь не так много, поскольку конструктор Employee настолько похож на человека, и единственная функция в прототипе переопределяется. Сила в полиморфном дизайне - это совместное поведение.

Ответ 2

Как объясняется в этом другом ответе, полиморфизм имеет разные интерпретации.

Лучшее объяснение по этому вопросу, которое я когда-либо читал, - это статья Луки Карделли, известного теоретика. Статья называется " О типах, абстракции данных и полиморфизме".

Что это?

Карделли определяет несколько типов полиморфизма в этой статье:

  • универсальный
    • параметрический
    • включение
  • Для этого случая
    • oveloading
    • принуждение

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

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

Тем не менее, JavaScript имеет форму наследования типов, которая имитирует те же идеи полиморфизма подтипов (классифицированные как полиморфизм включения Карделли выше) аналогично тому, что мы обычно делаем в других объектно-ориентированных языках программирования, таких как Java или С# (как объяснено в другой ответ, которым я поделился выше).

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

Ошибочно полагать, что полиморфизм связан только с объектно-ориентированным программированием. Другие модели программирования (функциональные, процедурные, логические и т.д.) Предлагают различные формы полиморфизма в своих системах типов, вероятно, немного незнакомые тем, которые используются только для ООП.

Зачем нам это нужно?

Полиморфизм способствует развитию многих хороших атрибутов в программном обеспечении, среди прочего он способствует модульности и возможности повторного использования и делает систему типов более гибкой и гибкой. Без этого было бы очень сложно рассуждать о типах. Полиморфизм гарантирует, что один тип может быть заменен другими совместимыми при условии, что они удовлетворяют общедоступному интерфейсу, поэтому это также способствует скрытию информации и модульности.

Как это работает?

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

Тема немного широка, и вы открыли два вопроса в одном посте. Возможно, лучше начать с чтения статьи Карделли, а затем попытаться понять полиморфизм независимо от языка или парадигмы программирования, а затем вы начнете устанавливать связи между теоретическими концепциями и тем, что может предложить любой конкретный язык, например JavaScript, для реализации этих идей.

Ответ 3

Какова цель полиморфизма?

Полиморфизм делает систему статического типа более гибкой, не теряя (значительную) безопасность статического типа, ослабляя условия эквивалентности типов. Доказательство остается в том, что программа будет работать только в том случае, если она не содержит ошибок типа.

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

Как это применимо к Javascript?

Javascript имеет слабую динамическую систему типов. Такая система типов эквивалентна строгой системе типов, содержащей только один тип. Мы можем думать о таком типе, как огромный тип объединения (псевдо синтаксис):

type T =
 | Undefined
 | Null
 | Number
 | String
 | Boolean
 | Symbol
 | Object
 | Array
 | Map
 | ...

Каждое значение будет связано с одной из этих альтернатив типа во время выполнения. И поскольку Javascript слабо типизирован, каждое значение может менять его тип сколько угодно раз.

Если мы возьмем теоретическую точку типа и рассмотрим, что существует только один тип, мы можем с уверенностью сказать, что система типа Javascript не имеет понятия полиморфизма. Вместо этого у нас есть утиная типизация и неявное принуждение типа.

Но это не должно мешать нам думать о типах в наших программах. Из-за отсутствия типов в Javascript нам нужно вывести их во время процесса кодирования. Наш ум должен стоять за отсутствующий компилятор, т.е. Как только мы посмотрим на программу, мы должны распознавать не только алгоритмы, но и базовые (возможно, полиморфные) типы. Эти типы помогут нам создавать более надежные и более надежные программы.

Чтобы сделать это правильно, я дам вам обзор наиболее распространенных проявлений полиморфизма.

Параметрический полиморфизм (aka generics)

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

// parametric polymorphic functions

const id = x => x;

id(1); // 1
id("foo"); // "foo"

const k = x => y => x;
const k_ = x => y => y;

k(1) ("foo"); // 1
k_(1) ("foo"); // "foo"

const append = x => xs => xs.concat([x]);

append(3) ([1, 2]); // [1, 2, 3]
append("c") (["a", "b"]); // ["a", "b", "c"]

Ad-hoc-полиморфизм (aka overloading)

Ad-hoc полиморфизм говорит, что разные типы эквивалентны только для определенной цели. Чтобы быть эквивалентным в этом смысле, тип должен реализовывать набор функций, специфичных для этой цели. Функция, которая определяет один или несколько параметров ad-hoc полиморфного типа, тогда должна знать, какие множества функций связаны с каждым из своих аргументов.

Ad-hoc-полиморфизм делает функцию совместимой с более крупным доменом типов. Следующий пример иллюстрирует цель "map-over" и как типы могут реализовать это ограничение. Вместо набора функций "отображаемое" ограничение включает только одну функцию map:

// Option type
class Option {
  cata(pattern, option) {
    return pattern[option.constructor.name](option.x);
  }
  
  map(f, opt) {
    return this.cata({Some: x => new Some(f(x)), None: () => this}, opt);
  }
};

class Some extends Option {
  constructor(x) {
    super(x);
    this.x = x;
  }
};

class None extends Option {
  constructor() {
    super();
  }
};


// ad-hoc polymorphic function
const map = f => t => t.map(f, t);

// helper/data

const sqr = x => x * x;

const xs = [1, 2, 3];
const x = new Some(5);
const y = new None();

// application

console.log(
  map(sqr) (xs) // [1, 4, 9]
);

console.log(
  map(sqr) (x) // Some {x: 25}
);

console.log(
  map(sqr) (y) // None {}
);

Ответ 4

что это такое?

Poly = many, морфизм = изменение формы или поведения.

зачем нам это нужно?

В программировании он используется, когда мы хотим, чтобы интерфейс функции (пусть функция X) был достаточно гибким, чтобы принимать разные типы или количество параметров. Кроме того, на основе изменения типов параметров или чисел мы могли бы хотеть, чтобы функция X вела себя по-другому (морфизм).

Как это работает?

Мы пишем несколько реализаций функции X, где каждая реализация принимает разные типы параметров или количество параметров. Основываясь на типе или числе параметров, компилятор (во время выполнения) решает, какая реализация X должна выполняться при вызове X из некоторого кода.

как я могу добиться этого полиморфного поведения в javascript?

JS не является типизированным языком, поэтому он действительно не предназначен для использования концепций ООП, таких как полиморфизм. Тем не менее, новая версия JS теперь включает в себя классы, и есть вероятность, что полиморфизм также может начать иметь смысл в JS. Другие ответы приводят к некоторым обходным решениям.

Ответ 5

JavaScript - это интерпретируемый язык, а не скомпилированный язык.

Время компиляции Полиморфизм (или статический полиморфизм) Полиморфизм времени компиляции - это не что иное, как перегрузка метода в java, С++

Таким образом, перегрузка метода невозможна в javascript.

Но полиморфизм Dynamic (run time) - это полиморфизм, существовавший во время выполнения поэтому переопределение метода возможно в javascript

другой пример - PHP.

Ответ 6

Полиморфизм означает, что способность вызывать один и тот же метод для разных объектов, и каждый объект реагирует по-разному, называется ПОЛИМОРФИЗМ.

    function Animal(sound){
    this.sound=sound;
    this.speak=function(){
    			return this.sound;
    	}
    }
//one method 
    function showInfo(obj){
    		console.log(obj.speak());
    }
//different objects
    var dog = new Animal("woof");
    var cat = new Animal("meow");
    var cow = new Animal("humbow");
//responds different ways
    showInfo(dog);
    showInfo(cat);
    showInfo(cow);

Ответ 7

@SooRaj Патил Бхак MC Кья Бхокаал Лиха Хай Бе