Хотелось бы узнать, что общего у мужчины и ребенка и чем они отличаются.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
typescript
extends
implements
Дэйвджоэм
источник
источник
Ответы:
Укороченная версия
extends
средства:Новый класс является ребенком . Он получает выгоду от наследования. Он имеет все свойства и методы в качестве своего родителя. Он может переопределить некоторые из них и реализовать новые, но родительский материал уже включен.
implements
средства:Новый класс можно рассматривать как же «формы» , в то время как это не ребенок . Его можно передать любому методу, где
Person
требуется, независимо от того, имеет ли родительский элемент, отличный отPerson
Больше ...
В ООП (такие языки, как C #, Java) мы бы использовали
extends
получать прибыль от наследства (см. вики ). Небольшой цитата:implements
будет больше для полиморфизма (см. вики ). Небольшой цитата:Итак, у нас может быть действительно другое дерево наследования
class Man
.но если мы также заявим, что можем притвориться другим типом -
Person
:.. тогда мы можем использовать его где угодно, где
Person
это необходимо. Нам просто нужно выполнить Persons"interface"
(т.е. реализовать все его публичные вещи) .implement
другой класс? Это действительно крутоКрасивое лицо Javascript (одно из преимуществ) - это встроенная поддержка Duck typing ( см. Вики ). Небольшой цитата:
Итак, в Javascript, если два разных объекта ... будут иметь один похожий метод (например
render()
), они могут быть переданы функции, которая его ожидает:Чтобы не потерять это - мы можем в Typescript сделать то же самое - с более типизированной поддержкой. И вот где
имеет свою роль там, где это имеет смысл
В языках ООП, как
C#
... нет способа сделать это ...Также здесь должна помочь документация:
Так что пока
extends
означает - он получает все от своего родителяimplements
в этом случае почти как реализация интерфейса. Дочерний объект может притвориться родительским ... но не получает никакой реализацииисточник
extends
- он получает все от своего родителя", применяется ли это к закрытым членам? Напримерclass Person {private name: string} class man extends Person{gender: string;}
,man
есть название свойства?В машинописном тексте (и некоторых других объектно-ориентированных языках) у вас есть классы и интерфейсы.
Интерфейс не имеет реализации, это просто «договор» о том, какие члены / метод имеет этот тип.
Например:
Экземпляры, реализующие этот
Point
интерфейс, должны иметь два члена типа number:x
иy
, и один метод,distance
который получает другойPoint
экземпляр и возвращаетnumber
.Интерфейс не реализует ничего из этого.
Классы - это реализации:
( код на детской площадке )
В вашем примере вы обрабатываете свой
Person
класс один раз как класс при его расширении и один раз как интерфейс при его реализации.Ваш код:
Имеется ошибка компиляции:
И это потому, что интерфейсам не хватает реализации.
Итак, если вы
implement
класс, вы берете только его «контракт» без реализации, поэтому вам нужно сделать это:( код на детской площадке )
Суть в том, что в большинстве случаев вам нужен
extend
другой класс, а неimplement
он.источник
Отличный ответ от @ nitzan-tomer! Мне очень помогло ... Я немного расширил его демо:
И как они ведут себя в функциях, ожидающих
IPoint
тип.Итак, то, что я изучил до сих пор и использовал как практическое правило: если вы используете классы и методы, ожидающие универсальных типов, используйте интерфейсы как ожидаемые типы. И убедитесь, что родительский или базовый класс использует этот интерфейс. Таким образом, вы можете использовать все подклассы в той мере, в какой они реализуют интерфейс.
Вот расширенная демонстрация
источник
extends
сосредоточиться на наследовании иimplements
сосредоточиться на ограничениях, будь то интерфейсы или классы.источник
Расширяет инструменты VS
extends
: Дочерний класс (который расширяется) наследует все свойства и методы класса, который расширяется.implements
: Класс, который используетimplements
ключевое слово, должен будет реализовать все свойства и методы класса, который онimplements
Проще говоря:
extends
: Здесь вы получаете все эти методы / свойства из родительского класса, поэтому вам не нужно реализовывать это самостоятельноimplements
: Вот договор, которому должен следовать класс. Класс должен реализовывать как минимум следующие методы / свойстваПример:
В этом примере мы можем заметить, что дочерний класс наследует все от Person, тогда как класс man должен реализовать все от самого Person.
Если бы мы удалили что-то из класса man, например метод walk, мы получили бы следующую ошибку времени компиляции :
источник