Dart中的构造函数
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ù)時可以省略。
命名構(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ù)
有時候可能有一種需求,并不需要每次都創(chuàng)建新的類實(shí)例,而是每一種情況,只需要一個實(shí)例,這時候工廠構(gòu)造函數(shù)就派上用場了。
工廠構(gòu)造函數(shù)使用關(guān)鍵字factory來定義,factory可以放在類名函數(shù)之前,也可以放在命名函數(shù)之前。
使用場景:
注意:
總結(jié)
以上是生活随笔為你收集整理的Dart中的构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Kotin 极简教程》第7章 面向对象
- 下一篇: 关于未来几年的发展,闰土有话要说