Menu
CoddyTech

命名构造函数

本课属于 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 库中很常见,有助于编写自解释的代码。

challenge icon

挑战

简单

让我们构建一个温度转换器,展示命名构造函数的强大之处。你将创建一个 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()
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器