polimorfismo interfaz herencia clases typescript abstract-class extends implements

interfaz - polimorfismo typescript



Extender vs implementar una clase abstracta pura en TypeScript (4)

Basándose en la respuesta de @ toskv , si extiende una clase abstracta, debe llamar a super() en el constructor de la subclase. Si implementa la clase abstracta, no tiene que llamar a super() (pero debe implementar todos los métodos declarados en la clase abstracta, incluidos los métodos privados).

La implementación de una clase abstracta en lugar de extenderla podría ser útil si desea crear una clase simulada para probar sin tener que preocuparse por las dependencias y el constructor de la clase original.

Supongamos que tengo una clase abstracta pura (es decir, una clase abstracta sin ninguna implementación):

abstract class A { abstract m(): void; }

Al igual que en C # y Java, puedo extender la clase abstracta:

class B extends A { m(): void { } }

Pero a diferencia de C # y Java, también puedo implementar la clase abstracta:

class C implements A { m(): void { } }

¿Cómo se comportan las clases B y C manera diferente? ¿Por qué elegiría uno versus el otro?

(Actualmente, el handbook TypeScript y la especificación del lenguaje no cubren las clases abstractas).


En el ejemplo de extensiones que le das, en realidad no agregas nada nuevo a la clase. Entonces se extiende por nada. Aunque extender por nada es un Typecript válido, me parece que en este caso ''implementos'' sería más apropiado. Pero al final del día son equivalentes.


La palabra clave implements trata la clase A como una interfaz, lo que significa que C tiene que implementar todos los métodos definidos en A , sin importar si tienen una implementación o no en A. Además, no hay llamadas a súper métodos en C.

extend se comporta más como lo que esperarías de la palabra clave. Debe implementar solo los métodos abstractos, y las súper llamadas están disponibles / generadas.

Supongo que en el caso de los métodos abstractos no hay diferencia. Pero rara vez tiene una clase con solo métodos abstractos, si lo hace, sería mucho mejor simplemente transformarla en una interfaz .

Puede ver esto fácilmente mirando el código generado. Hice un ejemplo de patio de recreo here .


Me condujeron aquí porque acababa de hacerme la misma pregunta y, mientras leía las respuestas, se me ocurrió que la elección también afectaría la instanceof operador.

Dado que una clase abstracta es un valor real que se emite a JS, puede usarse para verificaciones de tiempo de ejecución cuando una subclase la extiende.

abstract class A {} class B extends A {} class C implements A {} console.log(new B() instanceof A) // true console.log(new C() instanceof A) // false