0

这是来自 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(){}吗?谢谢。
对不起我的英语。

4

1 回答 1

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 中保证字段永远不会处于未初始化状态。记住初始化程序按它们列出的顺序运行也很好。

于 2012-12-31T18:49:20.767 回答