摘要:在编程世界里,面向对象编程(OOP)是一种强大的编程范式,而类则是OOP的核心构建块。在ArkTS语言中,类的设计和使用对于构建复杂、可维护的应用程序至关重要。今天,我们就来深入探讨一下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 = '';
}
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 = {
'John': 25,
'Mary': 21,
}
```
ArkTS中的类为开发者提供了丰富的功能和强大的编程能力。通过合理运用类的各种特性,我们可以编写出结构清晰、易于维护和扩展的代码。无论是开发小型应用还是大型项目,对类的深入理解和熟练运用都是至关重要的。希望这篇博客能帮助大家更好地掌握ArkTS中类的知识,在编程道路上更进一步!
来源:凌菲教育