interfaz - TypeScript accede al miembro de la clase base
polimorfismo typescript (1)
Ejemplo de trabajo Notas a continuación.
class Animal {
constructor(public name) {
}
move(meters) {
alert(this.name + " moved " + meters + "m.");
}
}
class Snake extends Animal {
move() {
alert(this.name + " is Slithering...");
super.move(5);
}
}
class Horse extends Animal {
move() {
alert(this.name + " is Galloping...");
super.move(45);
}
}
var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
No es necesario que asigne manualmente el nombre a una variable pública. Usar
public name
en la definición del constructor hace esto por usted.No necesita llamar a
super(name)
desde las clases especializadas.Usar
this.name
funciona.
Notas sobre el uso de super
.
Esto se trata con más detalle en la sección 4.8.2 de la especificación del lenguaje.
El comportamiento de las clases heredadas de Animal
no difiere del comportamiento en otros idiomas. Debe especificar la palabra clave super
para evitar confusiones entre una función especializada y la función de clase base. Por ejemplo, si llama a move()
o this.move()
, estaría tratando con la función especializada Snake
o Horse
, por lo que el uso de super.move()
llama explícitamente a la función de clase base.
No hay confusión de propiedades, ya que son las propiedades de la instancia. No hay diferencia entre super.name
y this.name
; simplemente hay this.name
. De lo contrario, podría crear un Caballo que tuviera diferentes nombres dependiendo de si estaba en la clase especializada o en la clase base.
Vea el ejemplo de herencia del patio de recreo en el sitio de TypeScript:
class Animal {
public name;
constructor(name) {
this.name = name;
}
move(meters) {
alert(this.name + " moved " + meters + "m.");
}
}
class Snake extends Animal {
constructor(name) { super(name); }
move() {
alert("Slithering...");
super.move(5);
}
}
class Horse extends Animal {
constructor( name) { super(name); }
move() {
alert(super.name + " is Galloping...");
super.move(45);
}
}
var sam = new Snake("Sammy the Python")
var tom: Animal = new Horse("Tommy the Palomino")
sam.move()
tom.move(34)
He cambiado una línea de código: la alerta en Horse.move (). Ahí quiero acceder a "super.nombre", pero eso retorna solo sin definir. Intellisense sugiere que puedo usarlo y TypeScript compila bien, pero no funciona. ¿Algunas ideas?