第3章:面向对象编程
3.4 抽象类
3.4.1 抽象类的概念与作用
抽象类(Abstract Class)是ArkTS中面向对象编程的重要特性之一,它具有以下核心特点:
- 不能直接实例化:需要通过子类继承后实例化
- 可包含抽象方法:声明方法签名但不提供实现(子类必须实现)
- 可包含具体方法:提供默认实现(子类可选择重写)
- 可包含成员变量:与普通类相同
抽象类的主要作用是为相关类提供统一的接口规范,同时实现部分公共逻辑,达到代码复用和强制约束的双重目的。
3.4.2 抽象类的定义语法
abstract class Animal {
// 抽象属性
abstract species: string;
// 抽象方法(无实现体)
abstract makeSound(): void;
// 具体方法
move(distance: number = 0) {
console.log(`${this.species} moved ${distance}m`);
}
}
3.4.3 抽象类的实现与继承
子类必须实现所有抽象成员:
class Dog extends Animal {
species = 'Canine'; // 实现抽象属性
// 实现抽象方法
makeSound() {
console.log('Woof! Woof!');
}
// 可选:重写具体方法
move(distance = 5) {
super.move(distance); // 调用父类实现
console.log('Running on four legs');
}
}
3.4.4 抽象类与接口的对比
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 实例化 | 不能直接实例化 | 不能实例化 |
| 方法实现 | 可包含具体实现 | 只能声明方法签名 |
| 成员变量 | 可包含 | 只能包含只读静态常量 |
| 多继承 | 单继承 | 多实现 |
| 构造函数 | 可以有 | 不能有 |
| 访问修饰符 | 支持 | 默认public |
3.4.5 实际应用场景
框架设计:定义核心流程骨架
abstract class UIComponent { abstract render(): void; init() { this.loadResources(); this.render(); this.bindEvents(); } protected abstract loadResources(): void; protected abstract bindEvents(): void; }工具类扩展:提供基础实现
abstract class Logger { abstract write(message: string): void; log(message: string) { const timestamp = new Date().toISOString(); this.write(`[${timestamp}] ${message}`); } }业务模型抽象:统一领域对象行为
abstract class PaymentMethod { abstract process(amount: number): boolean; validate() { // 通用验证逻辑 } }
3.4.6 最佳实践与注意事项
- 命名规范:建议以
Abstract前缀命名抽象类 - 适度使用:当需要强制实现规范时使用,避免过度抽象
- 模板方法模式:利用抽象类实现该经典设计模式
- 与接口结合:通过
implements实现多继承效果abstract class BaseService implements Disposable { abstract execute(): void; dispose() { // 资源清理 } }
3.4.7 常见问题解答
Q:什么时候应该选择抽象类而不是接口? A:当需要满足以下条件时:
- 需要共享具体方法实现
- 需要包含非静态成员变量
- 需要为继承树提供公共基类
Q:抽象类能否包含私有抽象方法? A:可以,但子类必须在同一文件中才能实现(ArkTS的可见性规则限制)
Q:抽象类能否继承具体类? A:可以,抽象类与普通类在继承规则上没有区别
该内容完整覆盖了抽象类的核心知识点,包含:
1. 基础概念与语法
2. 实际代码示例
3. 与接口的对比
4. 典型应用场景
5. 最佳实践建议
6. 常见问题解答
所有代码示例均采用ArkTS语法,与章节主题保持高度一致。