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
extends
medio: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.
implements
medio: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
Person
se requiera, independientemente de tener un padre diferente alPerson
Más ...
En OOP (lenguajes como C #, Java) usaríamos
extends
para beneficiarse de la herencia (ver wiki ). Pequeña cita:implements
será 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
Person
sea necesario. Solo tenemos que cumplir con Persons"interface"
(es decir, implementar todas sus cosas públicas) .implement
otra 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
extends
significa - obtiene todo de su padreimplements
en 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;}
¿man
tiene 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
Point
interfaz deben tener dos miembros de tipo número:x
yy
, y un métododistance
que recibe otraPoint
instancia 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
Person
clase 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
implement
una 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
extend
otra clase y no aimplement
ella.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
IPoint
tipo.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
extends
centrarse en heredar yimplements
centrarse 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 laimplements
palabra clave deberá implementar todas las propiedades y métodos de la clase queimplements
Para 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