Directorio de artículos
Complemento al uso básico de las clases de TypeScript
Uso de clases abstractas
Sabemos que la herencia es un requisito previo para el uso del polimorfismo .
Por lo tanto, cuando definimos muchas interfaces de llamada comunes, generalmente dejamos que la persona que llama pase a la clase principal para lograr un método de llamada más flexible a través del polimorfismo.
Sin embargo, es posible que la clase principal en sí misma no necesite implementar métodos específicos , por lo que los métodos definidos en la clase principal se pueden definir como métodos abstractos .
¿Qué es un método abstracto? Un método que no tiene una implementación concreta (sin cuerpo de método) en TypeScript es un método abstracto .
Una clase abstracta es una clase declarada usando abstract;
El método abstracto es un método declarado usando abstracto, el método abstracto debe existir en la clase abstracta y el método abstracto no tiene cuerpo de método;
Veamos el siguiente ejemplo
Por ejemplo, en el siguiente código, tenemos una función makeArea, que se usa para calcular el área de gráficos. Esta función puede calcular el área de gráficos como círculos y rectángulos, pero en la función, qué área de gráficos está implementado? ¿Qué gráficos están implementados? El área no es adecuada, por lo que podemos pasar un parámetro, y todos los parámetros pasados son necesarios para implementar el método getArea. Solo necesitamos llamar a getArea en la función.
Cree otra clase principal, defina la clase principal como una clase abstracta y defina un método abstracto getArea en la clase abstracta
Cuando necesitamos calcular el área de qué gráfico, podemos crear la clase de gráfico de área requerida, dejar que herede de la clase principal (clase abstracta) e implementar el método abstracto de la clase principal. Por ejemplo, en el siguiente código, he creado respectivamente la clase de área rectangular y área circular, déjelos heredar de la forma de la clase principal
function makeArea(shape: Shape) {
return shape.getArea()
}
// 定义抽象父类
abstract class Shape {
// 定义抽象方法
abstract getArea(): number
}
// 1.定义计算矩形面积的类
class Rectangle extends Shape {
width: number
height: number
constructor(width: number, height: number) {
super()
this.width = width
this.height = height
}
getArea() {
return this.width * this.height
}
}
// 2.定义计算圆形面积的类
class Circle extends Shape {
r: number
constructor(r: number) {
super()
this.r = r
}
getArea() {
return this.r * this.r * 3.14
}
}
// 测试
const reactangle = new Rectangle(10, 20)
const circle = new Circle(2)
console.log(makeArea(reactangle))
console.log(makeArea(circle))
Las clases abstractas tienen las siguientes características :
Las clases abstractas no se pueden instanciar (es decir, las clases abstractas no se pueden crear con new)
El método abstracto debe ser implementado por la subclase , de lo contrario la clase debe ser una clase abstracta, si es una clase abstracta, no se puede implementar;
tipo de clase
La clase en sí también se puede usar como un tipo de datos :
- Por ejemplo, en el siguiente código, en este momento p es de tipo Persona
class Person {
name: string = "aaa"
eating() {
console.log("eating")
}
}
const p = new Person()
- También podemos crear una variable p de manera literal, requiriendo que sea del tipo Persona, luego debemos asegurarnos de que las propiedades y métodos correspondientes deben ser consistentes con Persona
class Person {
name: string = "aaa"
eating() {
console.log("eating")
}
}
const p: Person = {
// 属性需要和Person类保持一致
name: "chenyq",
eating() {
console.log("p eating")
}
}
Escenarios de aplicación
Por ejemplo, en el desarrollo, se requiere que nuestra función encapsulada pase el tipo de una clase, de modo que la restricción pueda garantizar que las propiedades o los métodos de la clase se puedan usar normalmente en la función.
- Podemos pasar un objeto de instancia de la clase Person
class Person {
name: string
constructor(name: string) {
this.name = name
}
}
function printName(p: Person) {
console.log(p.name)
}
// 测试
const p1 = new Person("chenyq")
const p2 = new Person("kaisa")
printName(p1)
printName(p2)
- También puede pasar objetos que correspondan a los atributos y métodos de la clase Person uno a uno.
class Person {
name: string
eating() {
console.log("eating")
}
constructor(name: string) {
this.name = name
}
}
function printName(p: Person) {
console.log(p.name)
}
// 测试
printName({
name: "kaisa", eating() {
} })