🏗️ 第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()); // 唐老鸭 在水中悠闲游泳!最深 2m7.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(可选) |
子类自定义行为 |