VVLL.net

Class(类)

日期:2024-08-22 09:58:31

Class

在 TypeScript 中,类(Class)是面向对象编程的核心概念之一,它提供了一种结构化的方式来定义对象的蓝图,包括属性和方法。下面详细介绍 TypeScript 中类的定义、构造函数、属性、方法、继承、访问修饰符等相关内容。

1. 定义类

在 TypeScript 中定义一个类使用 class 关键字,类可以包含属性和方法。

class Person {
  // 属性
  firstName: string;
  lastName: string;

  // 构造函数
  constructor(firstName: string, lastName: string) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  // 方法
  greet() {
    return `Hello, ${this.firstName} ${this.lastName}`;
  }
}

// 创建对象
let person = new Person('John', 'Doe');
console.log(person.greet()); // 输出: Hello, John Doe

2. 构造函数

类的构造函数使用 constructor 关键字定义,用于初始化对象的实例。在构造函数中,可以初始化类的属性。

class Person {
  firstName: string;
  lastName: string;

  // 构造函数
  constructor(firstName: string, lastName: string) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
}

3. 属性和方法

类可以包含实例属性和方法,也可以包含静态属性和方法(通过 static 关键字定义)。

class Person {
  // 实例属性
  firstName: string;
  lastName: string;

  // 静态属性
  static species = 'Homo sapiens';

  // 构造函数
  constructor(firstName: string, lastName: string) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  // 实例方法
  greet() {
    return `Hello, ${this.firstName} ${this.lastName}`;
  }

  // 静态方法
  static introduceSpecies() {
    return `We are ${Person.species}`;
  }
}

let person = new Person('John', 'Doe');
console.log(person.greet()); // 输出: Hello, John Doe
console.log(Person.introduceSpecies()); // 输出: We are Homo sapiens

4. 继承

类可以通过 extends 关键字进行继承另一个类,子类(派生类)可以继承父类(基类)的属性和方法,并且可以扩展或重写它们。

class Employee extends Person {
  position: string;

  constructor(firstName: string, lastName: string, position: string) {
    super(firstName, lastName); // 调用父类的构造函数
    this.position = position;
  }

  // 重写父类的方法
  greet() {
    return `Hello, my name is ${this.firstName} ${this.lastName}, and I am a ${this.position}`;
  }
}

let employee = new Employee('Alice', 'Smith', 'Developer');
console.log(employee.greet()); // 输出: Hello, my name is Alice Smith, and I am a Developer

5. 访问修饰符

TypeScript 支持访问修饰符来控制类的成员(属性和方法)的访问权限。主要的访问修饰符包括 publicprivateprotected

  • public:默认的访问修饰符,成员在类内外都可以访问。
  • private:成员只能在类内部访问。
  • protected:成员在类内部和继承的子类中可以访问。
class Person {
  private age: number;

  constructor(private firstName: string, private lastName: string) {
    this.age = 0;
  }

  greet() {
    return `Hello, ${this.firstName} ${this.lastName}`;
  }
}

let person = new Person('John', 'Doe');
// console.log(person.age); // 错误: 'age' 是私有的
// console.log(person.firstName); // 错误: 'firstName' 是私有的
console.log(person.greet()); // 输出: Hello, John Doe

6. 抽象类

抽象类用于定义其他类继承的基类,不能被实例化。抽象类的方法在子类中必须被实现(除非它们自己也是抽象的)。

abstract class Animal {
  abstract makeSound(): void;

  move(): void {
    console.log('Moving...');
  }
}

class Dog extends Animal {
  makeSound(): void {
    console.log('Woof! Woof!');
  }
}

let myDog = new Dog();
myDog.makeSound(); // 输出: Woof! Woof!
myDog.move(); // 输出: Moving...

7. 使用类实现接口

类可以使用 implements 关键字来实现接口,一个类可以实现多个接口。

interface Shape {
  calculateArea(): number;
}

class Circle implements Shape {
  constructor(private radius: number) {}

  calculateArea(): number {
    return Math.PI * this.radius * this.radius;
  }
}

let circle = new Circle(5);
console.log(circle.calculateArea()); // 输出: 78.53981633974483

总结

在 TypeScript 中,类是面向对象编程的基础,它允许你组织代码以对象为中心,并通过继承和访问修饰符等机制实现代码的组织和封装。理解和熟练使用类是 TypeScript 中的重要一环,能够帮助你编写结构清晰、易于维护的代码。

参考

标签