# 类与面向对象

URL: https://caijiao.org/ts/part2/class-oop
Source: docs/ts/part2/class-oop.md
Description: TypeScript 中类的定义方式、继承机制、访问修饰符，以及如何结合接口使用类，并了解抽象类与多态的基础用法。

[TypeScript](/ts/) 在 JavaScript 基础上增强了面向对象编程能力，提供了完整的类支持和类型检查。

## 类的定义

使用 `class` 定义类并添加构造函数和方法：

```ts
class Person {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  greet(): void {
    console.log(`Hello, I'm ${this.name}`);
  }
}
```

## 继承与 super

通过 `extends` 关键字实现继承，子类可调用 `super()` 使用父类构造器：

```ts
class Student extends Person {
  grade: number;

  constructor(name: string, grade: number) {
    super(name);
    this.grade = grade;
  }

  study() {
    console.log(`${this.name} is studying in grade ${this.grade}`);
  }
}
```

## 访问修饰符

TypeScript 支持以下访问修饰符：

- `public`：默认，任何地方都可访问
- `private`：只能在类内部访问
- `protected`：只能在类内部和子类中访问

```ts
class Animal {
  protected name: string;

  constructor(name: string) {
    this.name = name;
  }
}

class Dog extends Animal {
  bark() {
    console.log(`${this.name} barks`);
  }
}
```

## 接口与类的结合使用

类可以实现接口，以强制类具有某些结构：

```ts
interface CanSpeak {
  speak(): void;
}

class Human implements CanSpeak {
  speak() {
    console.log("Speaking...");
  }
}
```

## 抽象类与多态

抽象类不能实例化，必须由子类实现抽象方法：

```ts
abstract class Shape {
  abstract area(): number;
}

class Circle extends Shape {
  constructor(public radius: number) {
    super();
  }

  area(): number {
    return Math.PI * this.radius * this.radius;
  }
}
```

多态性允许不同的子类以不同方式实现相同的方法，从而统一调用接口。

```ts
const shape: Shape = new Circle(5);
console.log(shape.area());
```

通过类、继承、抽象等机制，TypeScript 提供了强大的 OOP 支持，适合构建结构清晰、可维护的大型应用。
