Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第3章:面向对象编程

第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 实际应用场景

  1. 框架设计:定义核心流程骨架

    abstract class UIComponent {
      abstract render(): void;
      
      init() {
        this.loadResources();
        this.render();
        this.bindEvents();
      }
      
      protected abstract loadResources(): void;
      protected abstract bindEvents(): void;
    }
    
  2. 工具类扩展:提供基础实现

    abstract class Logger {
      abstract write(message: string): void;
      
      log(message: string) {
        const timestamp = new Date().toISOString();
        this.write(`[${timestamp}] ${message}`);
      }
    }
    
  3. 业务模型抽象:统一领域对象行为

    abstract class PaymentMethod {
      abstract process(amount: number): boolean;
      
      validate() {
        // 通用验证逻辑
      }
    }
    

3.4.6 最佳实践与注意事项

  1. 命名规范:建议以Abstract前缀命名抽象类
  2. 适度使用:当需要强制实现规范时使用,避免过度抽象
  3. 模板方法模式:利用抽象类实现该经典设计模式
  4. 与接口结合:通过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语法,与章节主题保持高度一致。
Last Updated:: 5/22/25, 5:00 PM