构造函数混乱

时间:2012-12-31 09:26:10

标签: syntax constructor dart

这是来自Dart样本(时钟样本)的类Ball的一部分:

  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(){}之间是否存在差异?谢谢。
抱歉我的英文。

1 个答案:

答案 0 :(得分:2)

两个版本都应该可以正常工作。 :表示法中的代码在构造函数体之前运行,因此它经常用于调用super:

class Person {
  String name;

  Person(this.name);
}

class Employee extends Person {
  Employee(name) : super(name) {
    print('ran after the super call');
  }
}

我认为函数体是一种更干净的方法,我相信“球”示例想要展示不同的样式,因为你也可以内联初始化值。

我通常使用函数体方法,除非它看起来更干净或者我正在调用父构造函数。

更新:Ladicek增加了公平分数。您可以内联或在初始化列表中初始化final字段。与某些语言不同,在Dart中可以保证字段永远不会处于未初始化状态。记住初始化程序按列出的顺序运行也很好。