[TypeScript] Uso de clases abstractas | Tipos de clases

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() {
    
    } })

Supongo que te gusta

Origin blog.csdn.net/m0_71485750/article/details/126336606
Recomendado
Clasificación