这是来自Dart示例(时钟示例)的Balls类的一部分:
DivElement root
num lastTime;
List<Ball> balls;
球() :
lastTime = new Date.now().millisecondsSinceEpoch,
balls = new List<Ball>() { \\I do not understand here, why use
root = new DivElement(); \\ List<Ball>(){...}
document.body.nodes.add(root);
makeAbsolute(root);
setElementSize(root, 0.0, 0.0, 0.0, 0.0);
}
因为我不明白,所以我更改了构造函数:
Balls() {
lastTime = new Date.now().millisecondsSinceEpoch;
balls = new List<Ball>() ;
root = new DivElement();
document.body.nodes.add(root);
makeAbsolute(root);
setElementSize(root, 0.0, 0.0, 0.0, 0.0);
}
该应用程序仍然有效。构造函数
Ball():
and Ball(){}
之间有什么区别?谢谢。对不起,我的英语。
最佳答案
两种版本都可以正常工作。 :
表示法中的代码在构造函数主体之前运行,因此通常用于诸如调用super之类的事情:
class Person {
String name;
Person(this.name);
}
class Employee extends Person {
Employee(name) : super(name) {
print('ran after the super call');
}
}
我认为函数体是一种更简洁的方法,并且我相信“balls”示例想展示不同的样式,因为您也可以内联初始化值。
我通常使用函数体方法,除非它看起来更干净或我正在调用父构造函数。
更新: Ladicek添加了公平点。您可以内联或在初始化列表中初始化
final
字段。并且与某些语言不同,在Dart中可以保证字段永远不会处于未初始化状态。还要记住,初始化程序是按照列出的顺序运行的。
关于syntax - 构造者的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14099790/