類與繼承
Dart 中類和java 相似,都是用class定義,抽象類用abstract 標(biāo)識,抽象類中可以包含已經(jīng)實現(xiàn)的方法,也可以包含未實現(xiàn)的方法,
與java不同的是,抽象方法不需要abstract 抽象類的關(guān)鍵字,只需要該方法未實現(xiàn)即可
繼承也與java的功能相似,用extends 定義 ,子類可以繼承父類的方法,如果想要修改可以重寫.
例子

Base抽象類中包含了三個已經(jīng)實現(xiàn)的方法,和一個未實現(xiàn)的抽象方法,

BClass? 繼承了 Base? 并重寫了 a(),b(),c()方法,實現(xiàn)了Base類未實現(xiàn)的方法d();
接口
Dart 中其實并沒有接口的概念,任何class 都可以作為接口被其他類實現(xiàn),這里面有一個比較有意思的地方,
AClass 中已實現(xiàn)的方法,當(dāng)AClass 作為接口被EClass實現(xiàn)的的時候, EClass無法調(diào)用AClass中已經(jīng)實現(xiàn)的方法,即super.method();這個不能用,感覺這個概念和java類似,java是在接口中壓根就沒有實現(xiàn),所以掉用不了,dart中雖然實現(xiàn)了,但是調(diào)用不了

也就是說作為接口被實現(xiàn)的時候,他所實現(xiàn)的方法不能被實現(xiàn)他的類調(diào)用,而且EClass 中必須重寫所有AClass方法
所以感覺在實際開發(fā)過程中,如果一個類想要當(dāng)做接口被實現(xiàn),利用 抽象類? 定義抽象方法,用這個抽象類作為接口被實現(xiàn)應(yīng)該是最好的解決方法了
mixins
mixins? 混入,? 這個是dart新引入的概念,? 他的寫法是
class cls extends cls1? with cls2,cls3{
}
如果cls1與? cls2和cls3中存在相同命名的方法,他的基礎(chǔ)執(zhí)行順序是從右到左依次執(zhí)行,
我們還是以上面? Base? AClass? BClass? 為例 ,為了更好的區(qū)分,我們再引入另一個類AClass2? 他有了 a()方法和g()方法,? AClass 實現(xiàn)了? a(),b() 兩個方法 ,Base 中? 有a(),b(),c(),d() 四個方法
其中a()方法為所有類中都包含的方法,如果想要執(zhí)行誰的a()方法,按照右到左的順序執(zhí)行,哪個類的排名應(yīng)該在最后,
而且已with 為關(guān)鍵字所指向的類,不能含有構(gòu)造方法,不能繼承除了Object的其他類,也就是無法繼承其他類,否則報錯,
例子



? ? ? ? ? ? ? ? ? ? ? ? 這個是簡寫

這個是完整的寫法,
如果某個類想要簡寫,就必須除了拼裝他所需要的類,不能再含有其他屬性,

結(jié)果

分析一下為什么結(jié)果會是這樣,
class CClass = BClass with AClass,AClass2;
a():這個方法是所有混入的類中共有的方法,按照從右到左的有效順序,a()方式應(yīng)該選擇ACass2的方法,所有打印的日志為? AClass2? a();
b():這個方法為AClass 與Base 方法共有的方法,按照從右到左的順序,應(yīng)該執(zhí)行AClass 中的b(),所有打印的是AClass b();
c():這個方法為BClass類中的方法,所以執(zhí)行BClass中的方法,先執(zhí)行 super.c(),在執(zhí)行 BClass.c()方法
d();與g()方法都是只有一個類中有,執(zhí)行有這個方法的類就可以了
我學(xué)習(xí)flutter的整個過程都記錄在里面了
http://www.itdecent.cn/c/36554cb4c804
最后附上demo 地址