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章:面向对象编程

封装、继承与多态

1. 封装(Encapsulation)

概念

封装是面向对象编程的三大特性之一,它将数据(属性)和行为(方法)捆绑在一个单元(类)中,并对外隐藏内部实现细节。通过访问修饰符(如private、protected、public)控制对类成员的访问权限。

ArkTS中的实现

class Person {
  private name: string; // 私有属性,仅类内可访问
  protected age: number; // 受保护属性,子类可访问
  public gender: string; // 公共属性,任意位置可访问

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

  // 公共方法暴露私有属性
  public getName(): string {
    return this.name;
  }
}

优势

  • 提高代码安全性(防止非法修改)
  • 隐藏实现细节,降低耦合度
  • 便于维护(内部修改不影响外部调用)

2. 继承(Inheritance)

概念

继承允许子类继承父类的属性和方法,实现代码复用和层次化设计。ArkTS使用extends关键字实现单继承。

基础语法

class Animal {
  move(distance: number = 0) {
    console.log(`移动了 ${distance} 米`);
  }
}

class Dog extends Animal {
  bark() {
    console.log("汪汪!");
  }
}

const dog = new Dog();
dog.move(10); // 继承父类方法
dog.bark();   // 调用子类特有方法

方法重写(Override)

子类可以重写父类方法以实现特定行为:

class Cat extends Animal {
  move(distance = 5) { // 重写move方法
    console.log("猫步轻盈...");
    super.move(distance); // 调用父类实现
  }
}

注意事项

  • ArkTS不支持多重继承
  • 构造函数中需先调用super()才能使用this

3. 多态(Polymorphism)

概念

多态指同一操作作用于不同对象时产生不同的行为,通常通过继承和接口实现。包含两种形式:

  1. 编译时多态:方法重载(ArkTS不支持)
  2. 运行时多态:方法重写

实现示例

class Shape {
  draw() {
    console.log("绘制形状");
  }
}

class Circle extends Shape {
  draw() {
    console.log("绘制圆形");
  }
}

class Square extends Shape {
  draw() {
    console.log("绘制方形");
  }
}

function render(shapes: Shape[]) {
  shapes.forEach(shape => shape.draw());
}

const shapes = [new Circle(), new Square()];
render(shapes); 
// 输出:
// 绘制圆形
// 绘制方形

多态的优势

  • 提高代码扩展性
  • 简化调用逻辑(统一接口)
  • 支持开闭原则(对扩展开放,对修改关闭)

4. 综合应用案例

场景描述

实现一个图形管理系统,支持计算不同图形的面积。

abstract class Graphic {
  abstract calculateArea(): number;
}

class Rectangle extends Graphic {
  constructor(private width: number, private height: number) {
    super();
  }

  calculateArea(): number {
    return this.width * this.height;
  }
}

class Circle extends Graphic {
  constructor(private radius: number) {
    super();
  }

  calculateArea(): number {
    return Math.PI * this.radius ** 2;
  }
}

// 使用多态处理不同图形
const graphics: Graphic[] = [
  new Rectangle(10, 5),
  new Circle(7)
];

graphics.forEach(g => {
  console.log(`图形面积: ${g.calculateArea().toFixed(2)}`);
});

关键点说明

  1. 通过抽象类定义统一接口
  2. 子类实现具体行为
  3. 多态调用时自动匹配实际对象类型

本章小结

特性核心思想ArkTS实现方式
封装隐藏细节,暴露接口访问修饰符 + getter/setter
继承代码复用,层次化设计extends关键字
多态同一接口,不同实现方法重写 + 抽象类/接口

最佳实践提示:

  • 优先使用组合而非继承(避免过度继承)
  • 对扩展开放,对修改关闭(OCP原则)
  • 合理使用protected修饰符平衡封装与继承需求
Last Updated:: 5/22/25, 5:00 PM