7  第6章 类与面向对象编程

🏗️ 第6章 类与面向对象编程

ArkTS 完整支持 TypeScript 的 OOP 体系,同时引入装饰器增强能力。掌握类、继承、接口,写出优雅可复用的 HarmonyOS 代码。

7.1 6.1 类的基本概念

📦
封装

把数据和方法包装在一个类里

🧬
继承

子类继承父类属性和方法

🎭
多态

同一接口,不同实现行为

🔒
访问修饰符

public / private / protected

7.1.1 类的定义语法

语法结构
class 类名 {
  // 属性(成员变量)
  属性名: 类型 = 初始值;

  // 构造函数
  constructor(参数: 类型) {
    this.属性名 = 参数;
  }

  // 方法
  方法名(): 返回类型 {
    // 方法体
  }
}

基础示例 —— Person 类:

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): string {
    return `大家好,我是 ${this.name},今年 ${this.age} 岁!`;
  }

  isAdult(): boolean {
    return this.age >= 18;
  }
}

// 创建实例
let p = new Person("张明", 20);
console.log(p.greet());      // 大家好,我是 张明,今年 20 岁!
console.log(p.isAdult());    // true

🎮 Person 类模拟器

点击"创建实例"查看输出...

7.2 6.2 访问修饰符

class BankAccount {
  private balance: number;    // 私有:只能类内访问
  protected owner: string;    // 受保护:子类可访问
  public bank: string;        // 公开:任何地方可访问

  constructor(owner: string, initial: number) {
    this.owner = owner;
    this.balance = initial;
    this.bank = "华夏银行";
  }

  // 公开方法提供受控访问
  deposit(amount: number): void {
    if (amount > 0) this.balance += amount;
  }

  getBalance(): number {
    return this.balance;  // 通过方法暴露私有属性
  }
}

let acc = new BankAccount("李华", 1000);
acc.deposit(500);
console.log(acc.getBalance()); // 1500
// acc.balance  // ❌ 错误!私有属性不可直接访问
⚠️ 注意
ArkTS 的 private 在编译时检查;运行时不同于 JavaScript 的 # 私有字段,但效果等价。养成习惯:敏感数据用 private,只通过方法暴露。

7.3 6.3 继承 extends

class Animal {
  name: string;
  constructor(name: string) { this.name = name; }
  speak(): string { return `${this.name} 发出声音`; }
}

class Dog extends Animal {
  breed: string;
  constructor(name: string, breed: string) {
    super(name);        // 必须先调用 super()
    this.breed = breed;
  }
  speak(): string {    // 重写父类方法(多态)
    return `${this.name}${this.breed}):汪汪汪!`;
  }
  fetch(): string { return `${this.name} 捡回了球!`; }
}

class Cat extends Animal {
  speak(): string { return `${this.name}:喵~`; }
}

let animals: Animal[] = [
  new Dog("旺财", "金毛"),
  new Cat("咪咪"),
];
animals.forEach(a => console.log(a.speak()));
// 旺财(金毛):汪汪汪!
// 咪咪:喵~

🐾 动物继承演示

点击添加动物查看多态效果...

7.4 6.4 接口 interface

接口定义行为契约,类通过 implements 实现:

interface Flyable {
  maxAltitude: number;
  fly(): string;
  land(): string;
}

interface Swimmable {
  maxDepth: number;
  swim(): string;
}

// 一个类可以实现多个接口
class Duck extends Animal implements Flyable, Swimmable {
  maxAltitude: number = 100;
  maxDepth: number = 2;

  fly(): string { return `${this.name} 扑扇翅膀飞翔!最高 ${this.maxAltitude}m`; }
  land(): string { return `${this.name} 降落在水面`; }
  swim(): string { return `${this.name} 在水中悠闲游泳!最深 ${this.maxDepth}m`; }
  speak(): string { return `${this.name}:嘎嘎嘎!`; }
}

let duck = new Duck("唐老鸭");
console.log(duck.fly());   // 唐老鸭 扑扇翅膀飞翔!最高 100m
console.log(duck.swim());  // 唐老鸭 在水中悠闲游泳!最深 2m

7.5 6.5 泛型类

// 泛型栈(Stack)
class Stack<T> {
  private items: T[] = [];

  push(item: T): void { this.items.push(item); }
  pop(): T | undefined { return this.items.pop(); }
  peek(): T | undefined { return this.items[this.items.length - 1]; }
  isEmpty(): boolean { return this.items.length === 0; }
  size(): number { return this.items.length; }
}

// 数字栈
let numStack = new Stack<number>();
numStack.push(1); numStack.push(2); numStack.push(3);
console.log(numStack.pop());  // 3
console.log(numStack.peek()); // 2

// 字符串栈
let strStack = new Stack<string>();
strStack.push("Hello"); strStack.push("ArkTS");
console.log(strStack.pop()); // ArkTS

🎮 泛型栈交互演示

栈状态(顶部 = 末尾):
操作日志...

7.6 6.6 章末总结

概念 关键字 用途
类定义 class 封装数据和方法
继承 extends 复用父类代码
接口 interface / implements 定义行为契约
访问修饰符 public / private / protected 控制访问权限
构造函数 constructor 初始化对象
泛型类 class Name<T> 类型安全的通用容器
方法重写 override(可选) 子类自定义行为