簡體   English   中英

如何制作dart中需要的超級構造函數

[英]How to make super constructor required in dart

我想 IDE 通知我需要在繼承的小部件的構造函數中構造超級構造函數。 例如,如果我有抽象 class 如下所示

abstract class BaseClass {
  final String name;

  BaseClass({
    @required String name,
  }) : this.name = name;
}

我想讓孩子 class 知道我需要實現超級構造函數。 下面的代碼在運行時拋出,但我如何確保它在構建時拋出或者 IDE 在構建之前讓我知道?

class ChildClass extends BaseClass{}

步驟1:

abstract class BaseClass {
  final String name;

  BaseClass(
    String name,
  ) : this.name = name;
}

class ChildClass extends BaseClass{
  ChildClass() {}
}

您將收到來自 IDE 的警告:

超類“BaseClass”沒有零參數構造函數。

這意味着您需要在 ChildClass 的構造函數中調用超類的構造函數。

第2步:

class ChildClass extends BaseClass{
  ChildClass() : super('Shubham');
  
  get getName => name;
}

現在我們可以創建一個ChildClass的實例來測試它。

void main() {
 var child =  ChildClass();
  print('Name : ${child.getName}');
}

Output:

舒巴姆

如果派生的 class 忽略顯式調用基本 class 構造函數,它會隱式調用具有零 arguments 的基類的默認(未命名)構造函數。 因此,您有多種選擇來獲得構建時警告:

  • 不要給基礎 class 一個未命名的構造函數。 命名所有基本 class 構造函數。
  • 使未命名的基礎 class 構造函數使用一個或多個必需的位置參數。
  • 使未命名的基本 class 構造函數使用一個或多個必需的命名參數。 這需要啟用 Dart 的 null 安全功能並使用新的required關鍵字而不是package:meta@required注釋。

如文檔Dart lang tour中所述

構造函數不被繼承

子類不從其超類繼承構造函數。 沒有聲明構造函數的子類只有默認(無參數,無名稱)構造函數。

因此,您必須調用超級構造函數才能獲得構建時間警告。

class ChildClass extends BaseClass{
  ChildClass() : super(); // This will give you 'The parameter 'name' is required.'
}

但是要在嘗試實例化它時得到警告,無論如何您都需要添加另一個必需的注釋。

class ChildClass extends BaseClass{
  ChildClass({@required name}) : super(name: name);
}

暫無
暫無

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

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