日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dart中的构造函数

發(fā)布時間:2023/12/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dart中的构造函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Dart中的構(gòu)造函數(shù)有4種,分別是:

  • ClassName(...) //普通構(gòu)造函數(shù)
  • Classname.identifier(...) //命名構(gòu)造函數(shù)
  • const ClassName(...) //常量構(gòu)造函數(shù)
  • factroy ClassName(...) //工廠構(gòu)造函數(shù)

?普通構(gòu)造函數(shù)

普通構(gòu)造函數(shù)可以分為無參構(gòu)造函數(shù)和有參構(gòu)造函數(shù)。

如果不聲明構(gòu)造函數(shù),則dart會提供一個默認(rèn)的無參構(gòu)造函數(shù)。當(dāng)然,也可以自己定義有參構(gòu)造函數(shù),如果自己寫了構(gòu)造函數(shù),那么默認(rèn)構(gòu)造函數(shù)就不存在了。

我們可以這么來定義一個有參構(gòu)造函數(shù)

class People{int? age;String? name;People(int age, String name){this.age = age;this.name = name;} }

這種賦值方式如果變量很多的話寫起來比較麻煩,所以dart提供了語法糖來簡化,直接在參數(shù)列表上這么寫:

class People{int? age;String? name;People(this.age, this.name); }

注意:

  • Dart?構(gòu)造函數(shù)不允許重載,即不允許有相同名稱的構(gòu)造函數(shù),否則編譯器會報(bào)錯

如果想設(shè)置不同的參數(shù)可通過可選參數(shù)列表來設(shè)置:

class People{int? age;String? name;People({this.age, this.name}); }

這種寫法涵蓋了這么幾種形式:

People(); People(this.age); People(this.name); People(int age, String name);
  • 當(dāng)子類繼承父類時,初始化子類構(gòu)造函數(shù)會優(yōu)先初始化父類構(gòu)造函數(shù),繼承時需要使用?super調(diào)用父類構(gòu)造函數(shù),若父類為無參構(gòu)造函數(shù)時可以省略。
class Child extends People{Child(int age, String name): super(age: age, name: name);// Child(int age, String name); 若父類為無參構(gòu)造函數(shù)時則可以省略super調(diào)用 }

命名構(gòu)造函數(shù)

格式:類名.構(gòu)造函數(shù)名

class People{int? age;String? name;People.fromMap(Map map){this.age = map["age"];this.name = map["name"];} }

使用命名構(gòu)造函數(shù)可為一個類實(shí)現(xiàn)多個構(gòu)造函數(shù),但是同樣是不能重載。

如果一個里只有命名構(gòu)造函數(shù),那么子類需要顯示調(diào)用父類的命名構(gòu)造函數(shù)。

class B extends People{B(Map map) : super.fromJson(map); }

否則會報(bào)錯


初始化列表

除了調(diào)用父類的構(gòu)造函數(shù),你還可以在執(zhí)行構(gòu)造函數(shù)體及調(diào)用父類構(gòu)造函數(shù)之前初始化實(shí)例變量,使用逗號分隔每個初始化變量。

class Employee extends People {int? no;String? job;String? address;int? age1;Employee(this.job, this.address, int? age): this.no = 123456,age1 = age ?? 25,super(age: age); }

調(diào)用的順序如下:

  • 初始化列表
  • 父類的構(gòu)造函數(shù)
  • 子類的構(gòu)造函數(shù)

參數(shù)列表對于初始化那些final修飾的成員變量很有用,因?yàn)樵诜椒w中,不能給final修飾的成員變量賦值,因?yàn)樵趫?zhí)行方法體的時候,final修飾的成員變量已經(jīng)不能變了。

注意:

  • 傳遞給父類構(gòu)造函數(shù)的參數(shù)及初始化表達(dá)式的右邊不能使用?this?關(guān)鍵字和訪問實(shí)例成員變量,因?yàn)樵趨?shù)傳遞的這一步驟,子類構(gòu)造函數(shù)尚未執(zhí)行,子類的實(shí)例對象也就還未初始化,因此所有的實(shí)例成員都不能被訪問。
  • 同一實(shí)例成員在參數(shù)列表和初始化列表中不能同時存在,

構(gòu)造函數(shù)傳遞(重定向構(gòu)造函數(shù))

定義構(gòu)造函數(shù)的時候,除了可以定義一個普通構(gòu)造函數(shù)之外,還可以定義若干個命名構(gòu)造函數(shù),這些構(gòu)造函數(shù)之間,有時候會有一些相同的邏輯,如果分別寫在各個構(gòu)造函數(shù)中,會顯得有些多余,所以構(gòu)造函數(shù)可以傳遞。傳遞構(gòu)造函數(shù)是沒有方法體的,可以在初始化列表中,調(diào)用另一個構(gòu)造函數(shù)。

class Point {final num x;final num y;final num area;Point(x, y): this.x = x,this.y = y,this.area = x * x + y * y;Point.alongXAxis(num x) : this(x, 0); }

如果添加方法體,編譯器會報(bào)錯。


常量構(gòu)造函數(shù)

如果生成類的對象是不會變的,可以定義常量構(gòu)造函數(shù)(如果你的類,創(chuàng)建的對象永遠(yuǎn)不會改變,你可以在編譯期就創(chuàng)建這個常量實(shí)例,并且定義一個常量構(gòu)造函數(shù),并且確保所有的成員變量都是final的。)。

class Point {final num x;final num y;final num area;const Point(x, y): this.x = x,this.y = y,this.area = x * x + y * y; }

在使用時需注意:

  • 常量構(gòu)造函數(shù)必須用?const?關(guān)鍵詞修飾;比如我們定義一個常量,給該常量賦的值必須也是常量。(使用const賦值聲明,后面的const可省略)。
  • 所有實(shí)例變量必須是?final?類型的。
  • 常量構(gòu)造函數(shù)不允許有函數(shù)體。
  • 實(shí)例化時需要加?const,?否則實(shí)例化的對象仍然可以修改變量值。
  • 工廠構(gòu)造函數(shù)

    有時候可能有一種需求,并不需要每次都創(chuàng)建新的類實(shí)例,而是每一種情況,只需要一個實(shí)例,這時候工廠構(gòu)造函數(shù)就派上用場了。

    工廠構(gòu)造函數(shù)使用關(guān)鍵字factory來定義,factory可以放在類名函數(shù)之前,也可以放在命名函數(shù)之前。

    使用場景:

  • 避免創(chuàng)建過多的重復(fù)實(shí)例,如果已創(chuàng)建該實(shí)例,則從緩存中拿出來。 class Logger {final String name;bool mute = false;// _cache 變量是庫私有的,因?yàn)樵谄涿智懊嬗邢聞澗€。static final Map<String, Logger> _cache =<String, Logger>{};factory Logger(String name) {return _cache.putIfAbsent(name, () => Logger._internal(name)); //工廠構(gòu)造函數(shù)里可以調(diào)用其他構(gòu)造函數(shù)。}factory Logger.fromJson(Map<String, Object> json) {return Logger(json['name'].toString());}Logger._internal(this.name);void log(String msg) {if (!mute) print(msg);} }
  • 實(shí)現(xiàn)簡單工廠模式,在java中抽象類是不能直接被實(shí)例化的,但是在dart中,使用工廠構(gòu)造函數(shù)可以讓抽象類被實(shí)例化。 abstract class Animal {String? name;void getNoise();factory Animal(String type, String name) {switch (type) {case "cat":return new Cat(name);case "dog":return new Dog(name);default:throw "The '$type' is not an animal";}} }class Cat implements Animal {String? name;Cat(this.name);@overridevoid getNoise() {print("${this.name}: 喵~");} }class Dog implements Animal {String? name;Dog(this.name);@overridevoid getNoise() {print("${this.name}: 旺~");} } void main() {var cat = new Animal("cat", "花花");var dog = new Animal("dog", "小黑");cat.getNoise(); // 花花: 喵~dog.getNoise(); // 小黑: 旺~ }
  • 單例模式,可用于工具類。 class Singleton {static final Singleton _singleton = Singleton._internal();factory Singleton() {return _singleton;}Singleton._internal(); } void main() {var s1 = Singleton();var s2 = Singleton();print(identical(s1, s2)); // true }
  • 注意:

  • 工廠構(gòu)造函數(shù)不能和其他構(gòu)造函數(shù)一樣,使用this關(guān)鍵字來調(diào)用class的屬性和方法。工廠構(gòu)造函數(shù)只能使用類中static類型的屬性和方法。
  • 在其他類型的構(gòu)造函數(shù)方法體里是不能有返回值,也就是不能出現(xiàn)return關(guān)鍵字,但是工廠函數(shù)是必須要有的,而且不能返回null。
  • 總結(jié)

    以上是生活随笔為你收集整理的Dart中的构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。