面向对象(Object-Oriented Programming, OOP)的四大核心概念:封装、继承、多态、抽象


举例背景:我们来设计一个「武林角色系统」

比如你在开发一个武侠游戏系统,其中有“人物”这一类对象,比如「李寻欢」、「西门吹雪」、「不良人」等。


1️⃣ 封装(Encapsulation)

把数据和行为“封”在一个对象里,对外只暴露该暴露的内容。
class WulinRole {
  private health: number;

  constructor(public name: string) {
    this.health = 100;
  }

  takeDamage(amount: number) {
    this.health -= amount;
  }

  getHealth() {
    return this.health;
  }
}

说明:health 是私有的,外部不能随便修改,只能通过 takeDamage()getHealth() 来控制 —— 这就是封装。


2️⃣ 继承(Inheritance)

子类可以继承父类的属性和方法,代码复用。
class Assassin extends WulinRole {
  constructor(name: string) {
    super(name);
  }

  assassinate(target: WulinRole) {
    console.log(`${this.name} 一击刺向 ${target.name}!`);
    target.takeDamage(40);
  }
}

说明:Assassin(刺客)继承自 WulinRole,拥有基础的血量和受伤机制,同时还能拓展自己的刺杀技能。


3️⃣ 多态(Polymorphism)

同一个方法名,在不同类中可以表现出不同的行为。
class Swordsman extends WulinRole {
  attack() {
    console.log(`${this.name} 使用剑法攻击!`);
  }
}

class Monk extends WulinRole {
  attack() {
    console.log(`${this.name} 使出降龙十八掌!`);
  }
}

function battle(role: WulinRole) {
  (role as any).attack();  // 不同角色,表现不同
}

说明:attack() 方法对不同角色表现不一样,这就是多态。


4️⃣ 抽象(Abstraction)

只暴露必要的接口,隐藏实现细节。常通过“抽象类”或“接口”来实现。
abstract class Role {
  constructor(public name: string) {}

  abstract attack(): void; // 不提供实现,子类自己定义
}

class Ninja extends Role {
  attack() {
    console.log(`${this.name} 暗影突袭!`);
  }
}

说明:Role 是抽象类,只定义了 attack() 方法接口,不关心实现细节,子类自己来实现。


✅ 总结一句话:

概念通俗理解
封装把数据藏起来,只暴露接口
继承子类继承父类,代码复用
多态同一接口,不同实现
抽象只暴露必要行为,隐藏细节
文章目录