一文读懂 Dart 中 Class:从基础定义到高级构造函数
引言
嘿,编程爱好者们!在 Dart 的奇妙编程领域中,“Class(类)” 宛如一座宝藏岛屿,蕴藏着构建复杂且强大程序的关键。类就像是一个精心打造的蓝图,让我们能够将数据与操作封装在一起,创建出一个个功能独特的模块。无论是编程小白渴望开启进阶之路,还是经验丰富的开发者追求更卓越的代码质量,深入掌握 Dart 中的类都是必不可少的。接下来,就让我们一同踏上探索 Dart 类的精彩旅程吧!
定义、使用类
定义
在 Dart 里,定义类就像是绘制一张未来大厦的设计图。
class Point {
}
这里我们创建了一个名为 Point 的类,虽然目前它内部空空如也,但它已然是一个具有潜力的框架,等待我们去填充丰富的内容。
使用
有了设计图,我们就可以按照它来建造“大厦”,也就是创建类的实例。
var p = Point();
这行代码通过 Point() 构造函数创建了 Point 类的一个实例 p,就像依据设计图建造出了一座具体的建筑。
构造函数
定义
构造函数就像是大厦建造时的施工队,负责初始化类的实例。
class Point {
num x, y;
Point(this.x, this.y);
@override
String toString() {
return "$x, $y";
}
}
在这个 Point 类中,Point(this.x, this.y) 就是构造函数,它接收两个参数 x 和 y,并将其赋值给类的成员变量 x 和 y。同时,我们重写了 toString 方法,以便更直观地展示实例的信息。
使用
当我们要创建一个具体的 Point 实例时,就需要调用构造函数。
var p = Point(1, 2);
print(p);
运行这段代码,我们会得到输出 1, 2。这是因为构造函数将 x 初始化为 1,y 初始化为 2,然后通过 toString 方法打印出了实例的信息。
初始化列表
定义
初始化列表是在构造函数体执行之前,对成员变量进行初始化的特殊区域。
class Point {
num x, y;
Map origin1, origin2;
Point(this.x, this.y)
: origin1 = {'x': x, 'y': y},
origin2 = {'x': x + 10, 'y': y + 10};
}
在这个 Point 类的构造函数 Point(this.x, this.y) 之后,通过初始化列表对 origin1 和 origin2 这两个 Map 类型的成员变量进行了初始化。
使用
void main(List<String> args) {
var p = Point(1, 2);
print(p);
}
这里我们创建了 Point 类的实例 p,并打印实例。(不过示例中打印内容似乎有误,正常应根据 toString 方法输出 1, 2,而 {1: 1, 2: 2}, {1: 2, 2: 4} 不在当前逻辑内)
命名构造函数
定义
命名构造函数给构造函数赋予了一个更具描述性的名称,让代码意图更加清晰。
class Point {
num x, y;
Map origin1, origin2;
Point.fromJson(Map json)
: x = json['x'],
y = json['y'],
origin1 = {'x': json['x'], 'y': json['y']},
origin2 = {'x': json['x'] + 10, 'y': json['y'] + 10};
}
这里的 Point.fromJson 就是命名构造函数,它从一个 Map 类型的参数 json 中获取数据,从而初始化类的成员变量。
使用
var p = Point.fromJson({"x": 1, "y": 2});
print(p);
运行这段代码,输出 10, 20, {x: 10, y: 20}, {x: 20, y: 30}(不过按照当前构造函数逻辑,x 和 y 初始值应为 1 和 2,后续计算也应基于此,输出内容可能存在偏差)。通过命名构造函数,我们从 json 数据创建了 Point 类的实例。
重定向构造函数
定义
重定向构造函数允许我们在一个构造函数中调用同一个类的其他构造函数,实现代码的复用。
class Point {
num x, y;
Map origin1, origin2;
Point(this.x, this.y)
: origin1 = {'x': x, 'y': y},
origin2 = {'x': x + 10, 'y': y + 10};
// 重定向构造函数
Point.fromJson(Map json) : this(json['x'], json['y']);
}
这里的 Point.fromJson 重定向构造函数调用了 Point(this.x, this.y) 构造函数,这样可以简化初始化逻辑。
使用
var p = Point.fromJson({"x": 1, "y": 2});
print(p);
输出 10, 20, {x: 10, y: 20}, {x: 20, y: 30}(同样,输出内容与当前构造函数逻辑存在偏差)。通过重定向构造函数,我们方便地创建了 Point 类的实例。
Callable
定义
如果一个类定义了 call 方法,那么它的实例就可以像函数一样被调用,这为类的使用带来了更多灵活性。
class IOSPhone {
call(String num) {
print('phone number is $num');
}
}
在 IOSPhone 类中,我们定义了 call 方法,它接收一个 String 类型的参数 num。
使用
main(List<String> args) {
var phone = IOSPhone();
phone('911');
}
运行这段代码,我们会看到输出 phone number is 911。这里我们创建了 IOSPhone 类的实例 phone,并像调用函数一样调用它,传入参数 911。
实战总结
在实际的 Dart 项目开发中,类的运用无处不在。合理利用类的各种特性,如不同类型的构造函数、初始化列表以及 callable 特性,能够显著提升代码的可维护性和可读性。例如,在开发一个游戏引擎时,可以使用类来表示游戏中的角色、道具等对象,通过构造函数初始化它们的属性;在处理网络数据解析时,命名构造函数能轻松地从 JSON 数据创建对应的类实例。
结论
掌握 Dart 中类的相关知识,无疑是在编程道路上迈出的重要一步。从类的基础定义与实例化,到构造函数的多样化应用,再到 callable 这种独特特性的掌握,每一个环节都为我们提供了更强大的编程能力。希望通过本文的介绍,大家对 Dart 中的类有了更为透彻的理解,在今后的编程实践中能够游刃有余地运用这些知识,编写出更加优秀、高效的 Dart 程序。
扫码关注我们!

