Me gustaría saber qué tienen en común el hombre y el niño y en qué se diferencian.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
typescript
extends
implements
davejoem
fuente
fuente

Respuestas:
Version corta
extendsmedio:La nueva clase es un niño . Obtiene beneficios que vienen con la herencia. Tiene todas las propiedades, métodos como padre. Puede anular algunos de estos e implementar nuevos, pero el material principal ya está incluido.
implementsmedio:La nueva clase puede tratarse como la misma "forma" , mientras que no es un niño . Se podría pasar a cualquier método donde
Personse requiera, independientemente de tener un padre diferente alPersonMás ...
En OOP (lenguajes como C #, Java) usaríamos
extendspara beneficiarse de la herencia (ver wiki ). Pequeña cita:implementsserá más por polimorfismo (ver wiki ). Pequeña cita:Entonces, podemos tener un árbol de herencia realmente diferente de nuestro
class Man.pero si también declaramos que podemos pretender ser de un tipo diferente -
Person:.. entonces podemos usarlo en cualquier lugar, donde
Personsea necesario. Solo tenemos que cumplir con Persons"interface"(es decir, implementar todas sus cosas públicas) .implementotra clase? Eso es realmente genialLa cara agradable de Javascript (uno de los beneficios) es el soporte integrado de la escritura Duck ( ver wiki ). Pequeña cita:
Entonces, en Javascript, si dos objetos diferentes ... tuvieran un método similar (por ejemplo
render()), se pueden pasar a una función que lo espera:Para no perder eso, podemos hacer lo mismo en TypeScript, con más soporte mecanografiado. Y ahí es donde
tiene su papel, donde tiene sentido
En lenguajes de programación orientada a objetos como
C#... no hay forma de hacer eso ...Además, la documentación debería ayudar aquí:
Entonces, mientras
extendssignifica - obtiene todo de su padreimplementsen este caso es casi como implementar una interfaz. El objeto hijo puede fingir que es padre ... pero no obtiene ninguna implementaciónfuente
extends-tiene todo de su padre", ¿se aplica a los miembros privados? Por ejemplo,class Person {private name: string} class man extends Person{gender: string;}¿mantiene el nombre de la propiedad?En mecanografiado (y algunos otros lenguajes OO) tienes clases e interfaces.
Una interfaz no tiene implementación, es solo un "contrato" de los miembros / método que tiene este tipo.
Por ejemplo:
Las instancias que implementan esta
Pointinterfaz deben tener dos miembros de tipo número:xyy, y un métododistanceque recibe otraPointinstancia y devuelve unnumber.La interfaz no implementa ninguno de esos.
Las clases son las implementaciones:
( código en el patio de recreo )
En su ejemplo, trata su
Personclase una vez como una clase cuando la extiende y una vez como una interfaz cuando la implementa.Tu codigo:
Tiene un error de compilación que dice:
Y eso se debe a que las interfaces carecen de implementación.
Entonces, si eres
implementuna clase, solo tomas su "contrato" sin la implementación, por lo que deberás hacer esto:( código en el patio de recreo )
La conclusión es que en la mayoría de los casos desea
extendotra clase y no aimplementella.fuente
¡Gran respuesta de @ nitzan-tomer! Me ayudó mucho ... Amplié un poco su demo con:
Y cómo se comportan en funciones que esperan un
IPointtipo.Entonces, lo que he aprendido hasta ahora y lo he estado usando como regla general: si está usando clases y métodos que esperan tipos genéricos, use interfaces como los tipos esperados. Y asegúrese de que el padre o la clase base use esa interfaz. De esa manera, puede usar todas las subclases en la medida en que implementan la interfaz.
Aquí la demo extendida
fuente
extendscentrarse en heredar yimplementscentrarse en la restricción, ya sean interfaces o clases.fuente
Extiende los implementos VS
extends: La clase secundaria (que se extiende) heredará todas las propiedades y métodos de la clase se extiendeimplements: La clase que usa laimplementspalabra clave deberá implementar todas las propiedades y métodos de la clase queimplementsPara decirlo en términos más simples:
extends: Aquí obtiene todos estos métodos / propiedades de la clase principal para que no tenga que implementar esto usted mismoimplements: Aquí hay un contrato que la clase debe cumplir. La clase tiene que implementar al menos los siguientes métodos / propiedadesEjemplo:
En el ejemplo podemos observar que la clase hija hereda todo de Person mientras que la clase man tiene que implementar todo de Person.
Si elimináramos algo de la clase man, por ejemplo, el método walk, obtendríamos el siguiente error de tiempo de compilación :
fuente