syntax - 构造者的困惑

标签 syntax constructor dart

这是来自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/

相关文章:

c++ - C++对象构造方法的区别

C++为什么vector初始化会调用copy constructor

oop - 如何在类构造函数参数中动态传递窗口小部件

flutter - 在浅色主题中更改图标颜色没有任何影响

dart - 接受具体类实例的方法

objective-c - ObjC中圆括号和大括号括起来的几个语句的赋值

Haskell 进口申报

c++ - 矮人调试信息缺少构造函数上的数据

javascript - 我正在尝试通过返回击键运行 javascript 函数,但是我的语法是错误的

syntax - 另一个 Swift 编译器错误?