2016-08-08 1 views

ответ

10

Документация должна помочь здесь:

Interfaces Extending Classes

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

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

class Control { 
    private state: any; 
} 

interface SelectableControl extends Control { 
    select(): void; 
} 

class Button extends Control { 
    select() { } 
} 

class TextBox extends Control { 
    select() { } 
} 

class Image extends Control { 
} 

class Location { 
    select() { } 
} 

Таким образом, в то время как

  • extends значит - он получает все от своего родителя
  • implements в этом случае почти как реализующий интерфейс. Детский объект может притворяться, что он является родителем .. но он не получает никакой реализации.
+0

, когда вы говорите «' extends'-он получает все от своих родителей», это относится к частным членам? Например, 'class Person {private name: string} class man extends Person {gender: string;}' does 'man' имеет имя свойства? – davejoem

+0

Частные также есть. Просто недоступен TS. Сделайте их защищенными, и вы можете их использовать. В случае «реализации» просто общественная часть имеет смысл. Надеюсь, это поможет немного. –

19

В машинописи (и некоторых других языках OO) у вас есть классы и интерфейсы.

Интерфейс не имеет реализации, это всего лишь «контракт» того, какие члены/методы имеют этот тип.
Например:

interface Point { 
    x: number; 
    y: number; 
    distance(other: Point): number; 
} 

Случаи, которые реализуют этот интерфейс Point должны иметь два члена номера типа: x и y, и один метод, который принимает distance другой Point экземпляр и возвращает number.
Интерфейс не реализует ни одно из них.

Классы реализации:

class PointImplementation implements Point { 
    public x: number; 
    public y: number; 

    constructor(x: number, y: number) { 
     this.x = x; 
     this.y = y; 
    } 

    public distance(other: Point): number { 
     return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2)); 
    } 
} 

(code in playground)

В вашем примере вы лечите свой Person класс один раз в классе, когда вы расширяете его и один раз в качестве интерфейса при его реализации.
Ваш код:

class Person { 
    name: string; 
    age: number; 
} 
class Child extends Person {} 

class Man implements Person {} 

Имеет ошибку компиляции, говоря:

класса 'человек' неправильно реализует интерфейс 'человек'.
Имущество 'name' отсутствует в типе 'Человек'.

И это потому, что интерфейсы не имеют реализации.
Так что, если вы implement класс, то вы только принять его «контракт» без реализации, так что вам нужно сделать, это:

class NoErrorMan implements Person { 
    name: string; 
    age: number; 
} 

(code in playground)

Суть в том, что в большинстве случаев вы хотите extend другой класс, а не implement.

1

Отличный ответ от @ nitzan-tomer! Помогал мне много ... Я протянул демо немного с:

IPoint interface; 
Point implements IPoint; 
Point3D extends Point; 

И как они ведут себя в функции ожидавшего типа IPOINT.

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

Hier extended demo

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/18734440) – aronisstav

+0

@aronisstav Я только опубликовал расширенную демонстрацию того, что нашел хороший ответ, который мне уже помог. Но, возможно, кто-то еще найдет работу, которую я сделал, добавив демо полезную. Это все. Комментарии на самом деле не предназначены для размещения кода-блока, поэтому я считаю его более понятным в Answer-Post. Так в чем проблема? – andzep

+0

Ваш ответ был (автоматически?) Отмечен по длине и содержанию, появился в моей очереди просмотра, и я дал оценку причинам, указанным в флагове. Его основной вклад (пояснив, что вы расширили демо) будет лучше, чем комментарий. С добавленным абзацем, возможно, это действительно более полезно. – aronisstav

Смежные вопросы