В чем разница между интерфейсом и абстрактным классом в Typescript? - PullRequest
0 голосов
/ 01 мая 2018

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

Я узнал, что у них одинаковое ограничение.

interface IPerson {
  name: string;
  talk(): void;
}

interface IVIP {
  code: number;
}

abstract class Person {
  abstract name: string;
  abstract talk(): void;
}

class ManagerType1 extends Person {
  // The error i get is that i need to implement the talk() method
  // and name property from its base class.
}

class ManagerType2 implements IPerson {
  // The error i get is that i need to implement the talk() method 
  // and the name property from the interface.
}


class ManagerType3 implements IPerson, IVIP {
  // Now the error i get is that i need to implement all the 
  // properties and methods of the implemented interfaces to the derive class
}

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

  1. Класс может распространяться только на один базовый класс
  2. Класс может реализовывать несколько интерфейсов.

Я правильно понял? Если да, то когда мне нужно его использовать?

UPDATE

Я не знаю, является ли правильный ответ, но вы можете использовать ОБА в зависимости от вашей ситуации. ООП действительно круто.

class ManagerType3 extends Person implements IPerson, IVIP {
  // Now the restriction is you need to implement all the abstract
  // properties and methods in the based class and all 
  // the properties and methods from the interfaces
}

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Еще большее отличие в TypeScript состоит в том, что (абстрактные) классы доступны во время выполнения, а интерфейсы - только во время компиляции. Это означает, что вы не можете, например, использовать instanceof с интерфейсами.

let x: any;

if (x instanceof IPerson) { // Error: 'IPerson' only refers to a type, but is being used as a value here.

}

if (x instanceof Person) { // OK

}

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

0 голосов
/ 01 мая 2018

Интерфейсы

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.

Оба подхода позволяют выполнять одно и то же. Но это два разных способа решения проблемы. Это не значит, что они стоят друг друга.

0 голосов
/ 01 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...