深入了解 TypeScript 继承

TypeScript 是 Microsoft 发布的一款开源的编程语言,它是 JavaScript 的一个超集,TypeScript 在 JavaScript 基础上添加了可选类型和类等面向对象编程的特性。在 TypeScript 中,类是一个重要的概念,类之间的继承是面向对象编程的一个核心。本篇文章从 TypeScript 继承的各个方面进行详细阐述。

一、继承的基本概念

继承是面向对象编程中的一个基本概念。通过继承,一个类可以派生出一个或多个子类,在子类中可以继承父类的属性和方法,并且还可以扩展自己的属性和方法。在 TypeScript 中,继承的语法与 JavaScript 中的类继承类似,使用 extends 关键字。

class Animal {
  type: string = 'animal';
  eat(food: string): void {
    console.log('eating', food);
  }
}
class Dog extends Animal {
  bark(): void {
    console.log('barking');
  }
}

在上述代码中,Dog 类通过 extends 关键字继承了 Animal 类的属性和方法,同时还增加了自己的 bark 方法。通过继承,Dog 实例化后就可以调用 Animal 中的 eat 方法,也可以调用自己新增的 bark 方法。

二、super 关键字

在子类中,如果要调用父类的属性或方法,可以使用 super 关键字。在子类的 constructor 中,可以通过 super() 调用父类的 constructor,也可以在子类方法中使用 super 调用父类方法。

class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}
class Dog extends Animal {
  constructor(name: string) {
    super(name);
  }
  bark(): void {
    console.log('barking');
  }
  eat(food: string): void {
    super.eat(food);
    console.log('dog is eating');
  }
}

在上述代码中,Animal 类有一个 name 属性,并且在 constructor 中接收一个参数,这个参数会给 name 赋值。在 Dog 类中,使用 super(name) 调用了 Animal 的 constructor,相当于给 Dog 的 name 属性赋了值。在 Dog 的 eat 方法中,使用 super.eat(food) 调用了 Animal 的 eat 方法,相当于执行了 Animal 中的 eat 方法,同时又增加了一个输出。

三、类的访问修饰符

在 TypeScript 中,类的属性和方法的访问权限可以通过访问修饰符来控制,访问修饰符包括 public、private 和 protected 三种。

public:表示公共的,可以被任何人访问到,包括类的内部和外部;

private:表示私有的,只可以在类的内部访问,不能在类的外部访问;

protected:表示受保护的,只可以在类的内部和子类中访问,不能在类的外部访问。

class Animal {
  public name: string;
  private age: number;
  protected gender: string;
  constructor(name: string, age: number, gender: string) {
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
  eat(food: string): void {
    console.log(`${this.name} is eating ${food}`);
  }
}
class Dog extends Animal {
  constructor(name: string, age: number, gender: string) {
    super(name, age, gender);
  }
  showAge(): void {
    // 报错,age 是 Animal 的私有属性,不能在子类中访问
    // console.log(`${this.name} is ${this.age} years old`);
    console.log(`${this.name} is ${super.age} years old`);
  }
  showGender(): void {
    console.log(`${this.name} is ${this.gender}`);
  }
}

在上述代码中,Animal 类有三个属性,使用了不同的访问修饰符。在 Dog 类中,调用了 super.age 来访问 Animal 类的 age 属性,由于 age 为 private 修饰符,不能通过 this.age 直接访问。在 showGender 方法中,可以直接访问 Animal 类的 protected 属性 gender。

四、抽象类和抽象方法

抽象类是不能被实例化的类,只能被继承。抽象类可以包含抽象方法,抽象方法必须在子类中被实现,否则会报错。

abstract class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  abstract eat(food: string): void;
}
class Dog extends Animal {
  constructor(name: string) {
    super(name);
  }
  eat(food: string): void {
    console.log(`${this.name} is eating ${food}`);
  }
}
const dog = new Dog('Tom');
// 报错,无法实例化抽象类
// const animal = new Animal('Bob');

在上述代码中,Animal 类是一个抽象类,它有一个抽象方法 eat,这个方法必须在子类中实现。在 Dog 类中,实现了 eat 方法,并且可以被实例化。在实例化时,尝试实例化 Animal,会报错,因为 Animal 是一个抽象类,不能被实例化。

五、接口与类的关系

在 TypeScript 中,类可以实现接口,实现接口的类必须实现接口中定义的属性和方法。

interface AnimalInterface {
  name: string;
  eat(food: string): void;
}
class Dog implements AnimalInterface {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  eat(food: string): void {
    console.log(`${this.name} is eating ${food}`);
  }
}
const dog = new Dog('Tom');

在上述代码中,AnimalInterface 接口定义了两个属性,名称和 eat 方法。然后 Dog 类实现了 AnimalInterface 接口,必须实现接口中定义的属性和方法。在实例化 Dog 时,需要传入一个参数 name,这个参数会给 Dog 的 name 属性赋值。

结束语

本文详细阐述了 TypeScript 继承的各个方面,包括继承的基本概念、super 关键字、类的访问修饰符、抽象类和抽象方法、接口与类的关系等。理解并熟练使用 TypeScript 的继承机制,能够使我们更好地进行面向对象编程,提高开发效率和代码质量。

原创文章,作者:QRLAU,如若转载,请注明出处:https://www.506064.com/n/331903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QRLAUQRLAU
上一篇 2025-01-20 14:11
下一篇 2025-01-20 14:11

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25

发表回复

登录后才能评论