Dart构造函数语法中的冒号

时间:2019-05-08 08:27:34

标签: dart flutter

<xsl:sort select="cbc:Percent" />

有人可以给我解释冒号class X extends Y { X(int a, int b) : super(a,b); } 的语法含义吗?

2 个答案:

答案 0 :(得分:1)

Dart 中的此功能称为“初始化列表”。
它允许您初始化类的字段,进行 assertions 并调用超级构造函数。

这意味着它与构造函数主体不同。如我所说,您只能初始化变量,并且只能访问 static 成员。您不能调用任何(非静态)方法。

好处是您还可以初始化 final 变量,而 在构造函数主体中无法执行。您还可以访问传递给构造函数的所有参数,而直接在括号中初始化参数时则没有此参数。
此外,您可以在分配的左侧使用类字段,该类字段的名称与引用参数的右侧的参数同名。 Dart将自动使用左侧的class字段。
这是一个示例:

class X {
  final int number;

  X(number) : number = number ?? 0;
}

上面的代码将名为number的参数分配给 final 字段this.number(如果非空),否则分配0 。这意味着分配的左侧number实际上是指this.number。现在,您甚至可以提出一个永不失败的断言(因此,它是多余的,但是我想解释所有事情如何协同工作):

class X {
  final int number;

  X(number): number = number ?? 0, assert(number != null);
}

Learn more

答案 1 :(得分:0)

可以访问初始化列表中的非静态成员。

class Point {
  num x, y;

  Point(this.x, this.y);
  Point.origin(): this.x = 10, this.y = 10;
}

main() {
  Point p = Point.origin();
  print(p.x); // 10
}