0

これは、ダーツサンプル(時計サンプル)からのクラスボールの一部です。

  DivElement root
  num lastTime;
  List<Ball> balls;

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

どちらのバージョンも正常に動作するはずです。表記のコード:はコンストラクター本体の前で実行されるため、スーパーの呼び出しなどによく使用されます。

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 に答える