当前位置: 首页 > news >正文

深入理解类:ArkTS面向对象编程的核心概念

# 深入理解类:ArkTS面向对象编程的核心概念

在编程世界里,面向对象编程(OOP)是一种强大的编程范式,而类则是OOP的核心构建块。在ArkTS语言中,类的设计和使用对于构建复杂、可维护的应用程序至关重要。今天,我们就来深入探讨一下ArkTS中类的相关知识。

## 类的基础:声明与实例化

ArkTS里,类声明引入新类型,定义字段、方法和构造函数。以`Person`类为例:

```typescript

class Person {

    name: string = '';

    surname: string = '';

    constructor(n: string, sn: string) {

        this.name = n;

        this.surname = sn;

    }

    fullName(): string {

        return this.name + ' ' + this.surname;

    }

}

```

定义好类后,可用`new`关键字创建实例,像`let p = new Person('John', 'Smith');` ,随后就能调用实例方法,比如`console.log(p.fullName());` 。此外,还能用对象字面量创建实例,不过这需要在可推导类型的上下文中进行。

## 类的成员:字段、方法与构造函数

### 字段:实例与静态的区别

字段是类中声明的变量,分为实例字段和静态字段。实例字段存在于每个类实例上,每个实例都有自己的一套。比如在`Person`类中:

```typescript

class Person {

    name: string = '';

    age: number = 0;

    constructor(n: string, a: number) {

        this.name = n;

        this.age = a;

    }

    getName(): string {

        return this.name;

    }

}

```

通过实例访问实例字段,像`let p1 = new Person('Alice', 25); p1.name;` 。而静态字段用`static`关键字声明,属于类本身,所有实例共享。比如统计`Person`类实例数量时:

```typescript

class Person {

    static numberOfPersons = 0;

    constructor() {

        Person.numberOfPersons++;

    }

}

Person.numberOfPersons;

```

同时,ArkTS要求字段在声明或构造函数中显式初始化,以避免运行时错误。

### 方法:实例与静态的不同行为

类的方法也有实例方法和静态方法之分。实例方法能访问实例字段和静态字段,像计算矩形面积的`RectangleSize`类:

```typescript

class RectangleSize {

    private height: number = 0;

    private width: number = 0;

    constructor(height: number, width: number) {

        this.height = height;

        this.width = width;

    }

    calculateArea(): number {

        return this.height * this.width;

    }

}

let square = new RectangleSize(10, 10);

square.calculateArea();

```

静态方法用`static`声明,只能访问静态字段,通过类名调用,用于定义类整体的公共行为:

```typescript

class Cl {

    static staticMethod(): string {

        return 'this is a static method.';

    }

}

console.log(Cl.staticMethod());

```

### 构造函数:对象初始化的关键

构造函数用于初始化对象状态。若未定义构造函数,会自动生成默认构造函数。派生类构造函数可用`super`调用父类构造函数:

```typescript

class RectangleSize {

    constructor(width: number, height: number) {

        //...

    }

}

class Square extends RectangleSize {

    constructor(side: number) {

        super(side, side);

    }

}

```

构造函数也能重载签名,为不同的初始化方式提供支持。

## 类的进阶特性:继承、方法重写与可见性修饰符

### 继承:代码复用的利器

继承让一个类能继承另一个类的字段和方法。例如:

```typescript

class Person {

    name: string = '';

    private _age = 0;

    get age(): number {

        return this._age;

    }

}

class Employee extends Person {

    salary: number = 0;

    calculateTaxes(): number {

        return this.salary * 0.42;

    }

}

```

子类继承父类成员,但不继承构造函数,还能新增或覆盖父类方法。

### 方法重写:灵活定制行为

子类可重写父类方法,重写方法需保持相同参数类型和相同或派生的返回类型。如:

```typescript

class RectangleSize {

    area(): number {

        return 0;

    }

}

class Square extends RectangleSize {

    private side: number = 0;

    area(): number {

        return this.side * this.side;

    }

}

```

### 可见性修饰符:控制访问权限

可见性修饰符有`private``protected``public``public`是默认修饰符,成员在任何可访问类的地方都可见;`private`修饰的成员只能在类内部访问;`protected`修饰的成员在派生类中也可访问。例如:

```typescript

class C {

    public x: string = '';

    private y: string = '';

    set_y (new_y: string) {

        this.y = new_y;

    }

}

let c = new C();

c.x = 'a';

c.y = 'b';

```

```typescript

class Base {

    protected x: string = '';

    private y: string = '';

}

class Derived extends Base {

    foo() {

        this.x = 'a';

        this.y = 'b';

    }

}

```

## 其他重要概念:抽象类、对象字面量

### 抽象类:定义通用概念

抽象类用`abstract`修饰,用于表示一组具体概念的共有概念,不能直接实例化。例如:

```typescript

abstract class X {

    field: number;

    constructor(p: number) {

        this.field = p;

    }

}

let x = new X(666)

```

抽象类的子类可以是抽象类或非抽象类,非抽象子类可实例化。抽象类中还能定义抽象方法,抽象方法只有声明没有实现,且只能在抽象类中存在。

### 对象字面量:便捷的实例创建方式

对象字面量可创建类实例并提供初始值,在特定上下文能替代`new`表达式。例如:

```typescript

class C {

    n: number = 0;

    s: string = '';

}

let c: C = {n: 42, s: 'foo'};

```

对于`Record`类型,对象字面量也常用于初始化:

```typescript

let map: Record<string, number> = {

    'John': 25,

    'Mary': 21,

}

```

ArkTS中的类为开发者提供了丰富的功能和强大的编程能力。通过合理运用类的各种特性,我们可以编写出结构清晰、易于维护和扩展的代码。无论是开发小型应用还是大型项目,对类的深入理解和熟练运用都是至关重要的。希望这篇博客能帮助大家更好地掌握ArkTS中类的知识,在编程道路上更进一步!

相关文章:

  • 批量操作的优点
  • idea mvn执行打包命令后控制台乱码
  • 【无标题】STM32CubeMX
  • 【SpringBoot+Vue自学笔记】003 SpringBoot Controll
  • Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比
  • 【音视频开发】第五章 FFmpeg基础
  • k8s调度器:如何控制Pod的分布
  • 【Android】 如何将 APK 内置为系统应用(适用于编辑设置属性)
  • vim编辑器
  • Android Compose Activity 页面跳转动画详解
  • 更换 CentOS 7.9 的系统源
  • 智能交响:EtherCAT转Profinet网关开启汽车自动化通信新纪元
  • Linux电源管理(三),CPUIdle 和 ARM的PSCI
  • VFlash的自动化和自定义动作
  • 深入理解Qt状态机的应用
  • C++23 新特性:std::size_t 字面量后缀 Z/z
  • B3634 最大公约数和最小公倍数
  • InfiniBand与RoCEv2负载均衡机制的技术梳理与优化实践
  • AWS中国区服务部署与ICP备案全流程指南:从0到1实现合规上线
  • Python爬虫实战:基于 Scrapy 框架的微博数据爬取研究
  • 中国纪检监察刊文:力戒形式主义官僚主义关键是要坚持实事求是
  • 《五行令》《攻守占》,2个月后国博见
  • 白玉兰奖征片综述丨海外剧创作趋势观察:跨界·融变·共生
  • 全国省市县国土空间总体规划已基本批复完成,进入全面实施阶段
  • 一船明月过沧州:为何这座城敢称“文武双全”?
  • 上交所五方面落实募资新规:强化关键少数责任和股东权利保障