命名构造函数
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 11 课,共 110 课。
命名构造函数允许你为一个类创建多个构造函数,并为每个构造函数取一个描述性名称,说明它的用途。当你需要用不同方式初始化对象时,这种做法尤其有用。
语法是类名后跟一个点和构造函数名:
class Point {
int x;
int y;
// 普通构造函数
Point(this.x, this.y);
// 用于创建原点的命名构造函数
Point.origin() : x = 0, y = 0;
// 使用单个值的命名构造函数
Point.diagonal(int value) : x = value, y = value;
}每个命名构造函数都提供了一种清晰易读的对象创建方式:
Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.diagonal(10);
print('p1: (${p1.x}, ${p1.y})'); // p1: (3, 5)
print('p2: (${p2.x}, ${p2.y})'); // p2: (0, 0)
print('p3: (${p3.x}, ${p3.y})'); // p3: (10, 10)命名构造函数能让代码更清晰易懂。与其猜测 Point(0, 0) 的含义,不如使用 Point.origin(),它能立即表达意图。这种模式在 Dart 库中很常见,有助于编写自解释的代码。
挑战
简单让我们构建一个温度转换器,展示命名构造函数的强大之处。你将创建一个 Temperature 类,根据起始温度的单位,以不同方式初始化它。
你将把代码分成两个文件:
temperature.dart:定义一个Temperature类,其中包含一个double celsius实例变量。这个类应提供三种创建温度的方式:- 一个常规构造函数
Temperature(this.celsius),直接接收摄氏温度值 - 一个命名构造函数
Temperature.fromFahrenheit,接收华氏温度值,并使用公式(fahrenheit - 32) * 5 / 9将其转换为摄氏温度 - 一个命名构造函数
Temperature.freezing(),创建一个温度为冰点(0 摄氏度)的对象
display()方法,用于输出:[celsius]C- 一个常规构造函数
main.dart:导入你的温度类,并创建三个温度对象:- 使用常规构造函数和
25.0创建一个对象 - 使用
fromFahrenheit和98.6创建一个对象 - 使用
freezing()创建一个对象
display()。- 使用常规构造函数和
预期输出格式:
25.0C
37.0C
0.0C亲手试试
import 'temperature.dart';
void main() {
// TODO: 用普通构造函数和 25.0 创建一个 Temperature 对象
// TODO: 用 fromFahrenheit 和 98.6 创建一个 Temperature 对象
// TODO: 用 freezing() 创建一个 Temperature 对象
// TODO: 按顺序对每个温度对象调用 display()
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器