第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)
概念
多态指同一操作作用于不同对象时产生不同的行为,通常通过继承和接口实现。包含两种形式:
- 编译时多态:方法重载(ArkTS不支持)
- 运行时多态:方法重写
实现示例
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)}`);
});
关键点说明
- 通过抽象类定义统一接口
- 子类实现具体行为
- 多态调用时自动匹配实际对象类型
本章小结
| 特性 | 核心思想 | ArkTS实现方式 |
|---|---|---|
| 封装 | 隐藏细节,暴露接口 | 访问修饰符 + getter/setter |
| 继承 | 代码复用,层次化设计 | extends关键字 |
| 多态 | 同一接口,不同实现 | 方法重写 + 抽象类/接口 |
最佳实践提示:
- 优先使用组合而非继承(避免过度继承)
- 对扩展开放,对修改关闭(OCP原则)
- 合理使用
protected修饰符平衡封装与继承需求
