簡體   English   中英

Dart 中類構造函數語法的區別

[英]Difference between class constructor syntax in Dart

我有一個我正在創建的類,如下所示:

class Movie {
  final String title, posterPath, overview;

  Movie(this.title, this.posterPath, this.overview);

  Movie.fromJson(Map json) {
    title = json["title"];
    posterPath = json["poster_path"];
    overview = json['overview';
  }
}

我收到一條警告說“必須初始化最終變量 'overview', 'posterPath', & '1' more 。每個變量周圍也有警告說 'title' 不能用作 setter,因為它是最終的。

當我使用此語法編寫構造函數時,警告消失:

Movie.fromJson(Map json)
   : title = json["title"],
     posterPath = json["poster_path"],
     overview = json['overview'];

這里到底發生了什么?

在任何人獲得對新對象的引用之前,必須完全初始化 Dart 對象。 由於構造函數的主體可以訪問this ,因此進入構造函數主體之前需要對對象進行初始化。

要做到這一點,生成 Dart 構造函數有一個初始化列表,看起來類似於 C++,您可以在其中初始化字段,包括最終字段,但您還不能訪問對象本身。 語法:

Movie.fromJson(Map json)
    : title = json["title"],
      posterPath = json["poster_path"],
      overview = json['overview'];

使用初始化列表( :之后的賦值列表)來初始化最終的實例變量titleposterPathoverview

第一個構造函數使用“初始化形式” this.title將參數直接放入字段中。

構造函數

Movie(this.title, this.posterPath, this.overview);

實際上是以下內容的簡寫:

Movie(String title, String posterPath, String overview)
    : this.title = title, this.posterPath = posterPath, this.overview = overview;

您的構造函數可以將所有這些和一個主體結合起來:

Movie(this.title, this.posterPath, String overview)
   : this.overview = overview ?? "Default Overview!" {
  if (title == null) throw ArgumentError.notNull("title");
}

(const 構造函數不能有一個主體,但它可以有一個初始化列表,對允許的表達式有一些限制,以確保它們可以在編譯時被評估)。

Dart 將屬性初始化與構造函數體分開。

構造函數有 3 個部分:

  • 名稱/參數定義
  • 屬性初始化/超級調用/斷言
  • 一個實體,類似於一個在構造時立即運行的函數

初始化和正文部分都是可選的。 final變量必須在前兩部分初始化。 它們不能在體內初始化。

完整的構造函數如下所示:

MyClass(int value)
    : assert(value > 0),
      property = value, 
      super();
{
  print("Hello World");
} 

這個初始化部分的主要目的是用於無體構造函數,它允許 const 構造函數,這是一個 dart 特定的特性。 請參閱const 構造函數實際上是如何工作的? 有關這些的更多詳細信息。

我剛剛找到了一些關於此的文檔,並且它認為第二個版本帶有:是所謂的“初始化列表”,它允許您在構造函數主體運行之前初始化實例變量。

此處的文檔中有更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM