Я хотел бы знать, что людей и ребенка имеет общие и чем они отличаются.В чем разница между «продолжается» и «орудие» в машинописном
class Person {
name: string;
age: number;
}
child extends Person {}
man implements Person{}
Я хотел бы знать, что людей и ребенка имеет общие и чем они отличаются.В чем разница между «продолжается» и «орудие» в машинописном
class Person {
name: string;
age: number;
}
child extends Person {}
man implements Person{}
Документация должна помочь здесь:
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
в этом случае почти как реализующий интерфейс. Детский объект может притворяться, что он является родителем .. но он не получает никакой реализации.В машинописи (и некоторых других языках 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));
}
}
В вашем примере вы лечите свой 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;
}
Суть в том, что в большинстве случаев вы хотите extend
другой класс, а не implement
.
Отличный ответ от @ nitzan-tomer! Помогал мне много ... Я протянул демо немного с:
IPoint interface;
Point implements IPoint;
Point3D extends Point;
И как они ведут себя в функции ожидавшего типа IPOINT.
Итак, что я узнал до сих пор и использовал в качестве правила большого пальца: если вы используете классы и методы, ожидающие общие типы, используйте интерфейсы как ожидаемые типы. И убедитесь, что родительский или базовый класс использует этот интерфейс. Таким образом, вы можете использовать все подклассы в тех, которые реализуют интерфейс.
Hier extended demo
Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/18734440) – aronisstav
@aronisstav Я только опубликовал расширенную демонстрацию того, что нашел хороший ответ, который мне уже помог. Но, возможно, кто-то еще найдет работу, которую я сделал, добавив демо полезную. Это все. Комментарии на самом деле не предназначены для размещения кода-блока, поэтому я считаю его более понятным в Answer-Post. Так в чем проблема? – andzep
Ваш ответ был (автоматически?) Отмечен по длине и содержанию, появился в моей очереди просмотра, и я дал оценку причинам, указанным в флагове. Его основной вклад (пояснив, что вы расширили демо) будет лучше, чем комментарий. С добавленным абзацем, возможно, это действительно более полезно. – aronisstav
, когда вы говорите «' extends'-он получает все от своих родителей», это относится к частным членам? Например, 'class Person {private name: string} class man extends Person {gender: string;}' does 'man' имеет имя свойства? – davejoem
Частные также есть. Просто недоступен TS. Сделайте их защищенными, и вы можете их использовать. В случае «реализации» просто общественная часть имеет смысл. Надеюсь, это поможет немного. –