TypeScript Herencia de clases y polimorfismo
TypeScript admite las características de herencia y polimorfismo de la programación orientada a objetos.
Diagrama SVG: jerarquía de herencia de clasesHerencia de clases
La herencia se implementa usando la palabra clave extends.
Ejemplo
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak(): void {
console.log(this.name + emitir sonido);
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name); // Llamar al constructor de la clase padre
this.breed = breed;
}
speak(): void {
console.log(this.name + ¡Guau guau guau!);
}
}
var dog = new Dog("Fortuna", Golden retriever);
dog.speak();
name: string;
constructor(name: string) {
this.name = name;
}
speak(): void {
console.log(this.name + emitir sonido);
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name); // Llamar al constructor de la clase padre
this.breed = breed;
}
speak(): void {
console.log(this.name + ¡Guau guau guau!);
}
}
var dog = new Dog("Fortuna", Golden retriever);
dog.speak();
Resultado de la ejecución:
¡Wangcai guau guau guau!
La palabra clave super
super se usa para llamar a los métodos y al constructor de la clase padre.
Ejemplo
class Shape {
color: string;
constructor(color: string) {
this.color = color;
}
describe(): string {
return Esta es una + this.color + figura;
}
}
class Circle extends Shape {
radius: number;
constructor(color: string, radius: number) {
super(color);
this.radius = radius;
}
// Sobrescribir el método de la clase padre
describe(): string {
// Llamar al método de la clase padre y extender
return super.describe() + , el radio es + this.radius;
}
area(): number {
return Math.PI * this.radius * this.radius;
}
}
var circle = new Circle(roja, 5);
console.log(circle.describe());
console.log(Área: + circle.area().toFixed(2));
color: string;
constructor(color: string) {
this.color = color;
}
describe(): string {
return Esta es una + this.color + figura;
}
}
class Circle extends Shape {
radius: number;
constructor(color: string, radius: number) {
super(color);
this.radius = radius;
}
// Sobrescribir el método de la clase padre
describe(): string {
// Llamar al método de la clase padre y extender
return super.describe() + , el radio es + this.radius;
}
area(): number {
return Math.PI * this.radius * this.radius;
}
}
var circle = new Circle(roja, 5);
console.log(circle.describe());
console.log(Área: + circle.area().toFixed(2));
Resultado de la ejecución:
这是一个 红色的图形,半径是 5 面积: 78.54
Polimorfismo
Las instancias de las subclases se pueden asignar al tipo de la clase padre.
Ejemplo
class Animal {
name: string;
constructor(name: string) { this.name = name; }
speak(): void {
console.log(this.name + emitir sonido);
}
}
class Cat extends Animal {
speak(): void {
console.log(this.name + ¡Miau miau miau!);
}
}
class Dog extends Animal {
speak(): void {
console.log(this.name + ¡Guau guau guau!);
}
}
// Polimorfismo: el array almacena instancias de diferentes subclases
var animals: Animal[] = [
new Cat(Blanquito),
new Dog("Fortuna"),
new Animal(animal)
];
// Llamar al mismo método, diferentes subclases tienen diferentes implementaciones
for (var _i = 0, animals_1 = animals; _i < animals_1.length; _i++) {
var animal = animals_1[_i];
animal.speak();
}
name: string;
constructor(name: string) { this.name = name; }
speak(): void {
console.log(this.name + emitir sonido);
}
}
class Cat extends Animal {
speak(): void {
console.log(this.name + ¡Miau miau miau!);
}
}
class Dog extends Animal {
speak(): void {
console.log(this.name + ¡Guau guau guau!);
}
}
// Polimorfismo: el array almacena instancias de diferentes subclases
var animals: Animal[] = [
new Cat(Blanquito),
new Dog("Fortuna"),
new Animal(animal)
];
// Llamar al mismo método, diferentes subclases tienen diferentes implementaciones
for (var _i = 0, animals_1 = animals; _i < animals_1.length; _i++) {
var animal = animals_1[_i];
animal.speak();
}
Resultado de la ejecución:
¡Xiaobai miau miau miau! ¡Wangcai guau guau guau! Los animales hacen sonidos.
Comprobación instanceof
Usa instanceof para comprobar el tipo de la instancia.
Ejemplo
class Rectangle {
width: number;
height: number;
constructor(width: number, height: number) {
this.width = width;
this.height = height;
}
area(): number {
return this.width * this.height;
}
}
class Circle {
radius: number;
constructor(radius: number) {
this.radius = radius;
}
area(): number {
return Math.PI * this.radius ** 2;
}
}
var shapes = [new Rectangle(4, 5), new Circle(3)];
for (var _i = 0, shapes_1 = shapes; _i < shapes_1.length; _i++) {
var shape = shapes_1[_i];
if (shape instanceof Rectangle) {
console.log(Área del rectángulo: + shape.area());
} else if (shape instanceof Circle) {
console.log(Área del círculo: + shape.area().toFixed(2));
}
}
width: number;
height: number;
constructor(width: number, height: number) {
this.width = width;
this.height = height;
}
area(): number {
return this.width * this.height;
}
}
class Circle {
radius: number;
constructor(radius: number) {
this.radius = radius;
}
area(): number {
return Math.PI * this.radius ** 2;
}
}
var shapes = [new Rectangle(4, 5), new Circle(3)];
for (var _i = 0, shapes_1 = shapes; _i < shapes_1.length; _i++) {
var shape = shapes_1[_i];
if (shape instanceof Rectangle) {
console.log(Área del rectángulo: + shape.area());
} else if (shape instanceof Circle) {
console.log(Área del círculo: + shape.area().toFixed(2));
}
}
Resultado de la ejecución:
矩形面积: 20 圆形面积: 28.27
Miembro protected
Los miembros protected son visibles en las subclases.
Ejemplo
class Person {
protected name: string;
constructor(name: string) {
this.name = name;
}
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public introduce(): string {
// Se puede acceder al miembro protected
return Yo soy + this.name + , en + this.department + trabajo;
}
}
var emp = new Employee("Alice", Departamento de tecnología);
console.log(emp.introduce());
// console.log(emp.name); // Error: protected no es accesible desde fuera
protected name: string;
constructor(name: string) {
this.name = name;
}
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public introduce(): string {
// Se puede acceder al miembro protected
return Yo soy + this.name + , en + this.department + trabajo;
}
}
var emp = new Employee("Alice", Departamento de tecnología);
console.log(emp.introduce());
// console.log(emp.name); // Error: protected no es accesible desde fuera
Resultado de la ejecución:
我是 Alice,在 技术部 工作
Resumen
- Herencia:Palabra clave extends
- super:Llamar a la clase padre
- Polimorfismo:Misma interfaz, diferentes implementaciones
- protected:Visible en la subclase