2016-08-25 52 views
3

我读的班dartlang.org资源,他们注意以下几点建设:“:”在dart的类构造函数中意味着什么?

import 'dart:math'; 

class Point { 
    final num x; 
    final num y; 
    final num distanceFromOrigin; 

Point(x, y) 
    : x = x, 
    y = y, 
    distanceFromOrigin = sqrt(pow(x, 2) + pow(y, 2)); 
} 

我不太明白的是“:”在点构造以及为什么/当我应该使用它?

回答

5

它启动“初始化程序列表”。

如果您的最终字段类似于Point类中的字段,则可以通过不同的方式对它们进行初始化。

class Point { 
    final num x = 3; 
    ... 
} 

class Point { 
    final num x; 
    constructor(this.x); 
} 

class Point { 
    final num x; 
    constructor(num x) : this.x = x * 3; 
} 

这是行不通的

class Point { 
    final num x = 3; 
    constructor(num x) { 
    this.x = x * 3; 
    } 
} 

,因为最终的字段不能从构造方法中进行修改。

初始值设定程序列出了一种解决此限制的方法,同时仍符合有关对象初始化顺序的保证。它在构造函数体之前执行。 这是一种在分配给最终字段之前检查或修改(分配默认值)传递的参数并进行一些计算的方法。

在初始化程序列表中使用this只允许分配给属性,但不允许从中读取以防止访问尚未初始化的属性。

对超级构造函数的调用也在初始化程序列表中完成,通常应该是列表中的最后一个调用。

class MyPoint extends Point { 
    constructor(num x) : super(x); 
} 
+0

谢谢!你能推荐Dart资源,而不是他们的在线api和dartlang.org吗? – Hydrocat

+1

我不知道。我从社区的讨论中学到了大部分内容。 Slack,(现在也是Gitter)Google组,StackOverflow,GitHub问题 –