Интерфейсы
interface
- это контракт , который определяет свойства и возможности объекта, который его реализует. Например, вы можете определить, на что способны Сантехник и Электрик :
interface Electrician {
layWires(): void
}
interface Plumber {
layPipes(): void
}
Затем вы можете использовать сервисы ваших интерфейсов:
function restoreHouse(e: Electrician, p: Plumber) {
e.layWires()
p.layPipes()
}
Обратите внимание, что способ реализации интерфейса является бесплатным. Вы можете сделать это, создав экземпляр класса или с помощью простого объекта:
let iAmAnElectrician = {
layWires: () => { console.log("Work with wires…") }
}
Интерфейс вообще не существует во время выполнения, поэтому сделать самоанализ невозможно. Это классический способ JavaScript для работы с объектным программированием, но с хорошим контролем во время компиляции определенных контрактов.
Абстрактные занятия
A class
является одновременно контрактом и реализацией фабрики . abstract class
также является реализацией, но не завершена. В частности, абстрактный класс существует во время выполнения, даже если он имеет только абстрактные методы (тогда можно использовать instanceof
).
Когда вы определяете абстрактный класс, вы часто пытаетесь контролировать, как должен быть реализован процесс. Например, вы можете написать что-то вроде этого:
abstract class HouseRestorer {
protected abstract layWires(): void
protected abstract layPipes(): void
restoreHouse() {
this.layWires()
this.layPipes()
}
}
Этот абстрактный класс HouseRestorer
определяет , как будут использоваться методы layWires
и layPipes
, но дочерний класс должен реализовать специализированные процедуры, прежде чем его можно будет использовать.
Абстрактные классы - это традиционный подход ООП, который не является традиционным в JavaScript.
Оба подхода позволяют выполнять одно и то же. Но это два разных способа решения проблемы. Это не значит, что они стоят друг друга.