這篇文章主要講解了Flutter中Dart的Mixin的用法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
創(chuàng)新互聯(lián)建站專注于企業(yè)成都營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、通山網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為通山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
這里補(bǔ)充一下Mixin的定義:
只要一個(gè)類是繼承自Object
的而且沒(méi)有定義構(gòu)造方法,那么這個(gè)類可以是一個(gè)Mixin了。當(dāng)然,如果你想讓mixin的定義更加的清晰,可以使用mixin關(guān)鍵字開頭來(lái)定義。具體請(qǐng)參考這里
原文截圖體會(huì)一下風(fēng)格。
正文
在經(jīng)典的面向?qū)ο缶幊陶Z(yǔ)言里一定會(huì)有常規(guī)的類,抽象類和接口。當(dāng)然,Dart也有它自己的接口,不過(guò)那是另外的文章要說(shuō)的。有的時(shí)候陰影里潛伏者另外的野獸:Mixin!這是做什么的,如何使用?我們來(lái)一起發(fā)現(xiàn)。
沒(méi)有mixin的世界
假設(shè)你在構(gòu)建一個(gè)模擬野生動(dòng)物的app,那么你需要一個(gè)Mosquito(蚊子)類。作為一個(gè)有預(yù)見性的開發(fā)人員,你會(huì)抽象蚊子們有的共通的東西然后放在一個(gè)抽象類里。
abstract class Insect { void crawl() { print('crawling'); } } abstract class AirborneInsect extends Insect { void flutter() { print('fluttering'); } void buzz() { print('buzzing annoyingly') } } class Mosquito extends AirborneInsect { void doMosquitoThing() { crawl(); flutter(); buzz(); print('sucking blood'); } }
很棒!你已經(jīng)做到了!添加新的昆蟲就如同微風(fēng)拂過(guò)一樣,根本不會(huì)有代碼的冗余出現(xiàn)。。。一直到你發(fā)現(xiàn)你需要一個(gè)Swallow類(就是一種可以吃掉整個(gè)蚊子的東西)。
同樣的也有很多鳥類共有的東西,我們可以創(chuàng)建一個(gè)Bird類。這個(gè)時(shí)候問(wèn)題就出現(xiàn)了 -- 鳥也會(huì)振動(dòng)翅膀!但是,你沒(méi)法把flutter方法從AirboneInsect類里面提取出來(lái)組成一個(gè)新的類Fluttering。
為什么?Bird類可以繼承Fluttering類,但是AirboneInsect不可以,它已經(jīng)繼承了Insect類了。Dart可不支持多繼承(真很好)。
這下,你需要給Bird類添加一個(gè)flutter方法了。代碼冗余發(fā)生了!
abstract class Bird { void chirp() { print('chirp chirp'); } // Duplicate method void flutter() { print('fluttering'); } } class Swallow extends Bird { void doSwallowThing() { chirp(); flutter(); print('eating a mosquito'); } }
使用mixin
Mixin的定義是“一種把類代碼用在多個(gè)繼承樹的方法”。簡(jiǎn)單的說(shuō),mixin讓你不用繼承就可以引入代碼塊的方法。聲明一個(gè)mixin非常的簡(jiǎn)單:
mixin Fluttering { void flutter() { pring('fluttering'); } }
這個(gè)mixin可以用在常規(guī)的類上面也可以用在抽象類,只需要一個(gè)with關(guān)鍵字。在野生動(dòng)物模擬app例子里,你也許要用在抽象類上了。
mixin Fluttering { void flutter() { print('fluttering'); } } abstract class Insect { void crawl() { print('crawling'); } } abstract class AirborneInsect extends Insect with Fluttering { void buzz() { print('buzzing annoyingly'); } } class Mosquito extends AirborneInsect { void doMosquitoThing() { crawl(); flutter(); buzz(); print('sucking blood'); } } abstract class Bird with Fluttering { void chirp() { print('chirp chirp'); } } class Swallow extends Bird { void doSwallowThing() { chirp(); flutter(); print('eating a mosquito'); } }
也可以在一個(gè)類上面使用多個(gè)mixin。如果需要在Bird類上用一個(gè)chirping mixn的話,就和Fluttering mixin一起用就好。
abstract class Bird with Fluttering, Chirping
限制Mixin的使用
有的時(shí)候你不想讓mixin用在早已存在的類上面,你只是想讓它用在某些特定的類或者其子類上。這通常你的代碼對(duì)早已存在的代碼有依賴。
在野生動(dòng)物app這個(gè)例子里,你發(fā)現(xiàn)僅僅支持swallow已經(jīng)不夠了。還有其他種類的鳥比如麻雀或者Blue Jay等。與麻雀不同,很多其他的鳥需要從地里面啄食,種子啊,蟲子啊的。。。
給Bird抽象類添加方法是不可能的,因?yàn)椴皇撬械镍B都需要啄食。所以,為了避免代碼冗余,你可以創(chuàng)建一個(gè)叫做Pecking的mixin。
mixin Pecking { void peck() { print('pecking'); } }
這至少比代碼榮譽(yù)好很多了。但是,也會(huì)有人把這個(gè)mixin用在Insect類上。這樣使用mixin問(wèn)題就大了。
當(dāng)你開始研究一個(gè)鳥類的動(dòng)作的時(shí)候,你會(huì)發(fā)現(xiàn)鳥兒在逐出食物之后就會(huì)發(fā)出愉悅的鳥鳴。從當(dāng)前的mixin里面調(diào)用chirp方法是不可能的。要改也非常簡(jiǎn)單,只要告訴Dart,Pecking mixin只能用在Bird類上面?,F(xiàn)在調(diào)用Bird
類的方法就沒(méi)有問(wèn)題了。
//... mixin Pecking on Bird { void peck() { print('pecking'); chirp(); } } class Sparrow extends Bird with Pecking {} class BlueJay extends Bird with Pecking {}
結(jié)論
Mixin對(duì)于繼承體系中避免代碼的冗余非常有用處。mixin
也可以被約束在只可以用在某些特定的類上面,這讓他們成為了開發(fā)的一大利器!
ps:下面在看下Flutter/Dart mixin類的理解
mixin
是將一些有共同特性的類抽出來(lái)共用,把具體的特性封裝成一個(gè)mixin
供其他類使用。本質(zhì)上是為了減少代碼冗余。而implement
也能實(shí)現(xiàn)這種功能,但是繼承自implement
的子類需要完全重寫父類的所有屬性與方法,這就造成了很多不必要的代碼冗余。
mixin
在使用上有如下特點(diǎn):
mixin
在定義時(shí)可以使用on關(guān)鍵字指定使用范圍
mixin swim on fish { //具體實(shí)現(xiàn) }
當(dāng)多個(gè)mixin
函數(shù)一樣時(shí),后一個(gè)mixin會(huì)覆蓋前面一個(gè)(線性特征)
class S { fun()=>print('A'); } mixin MA { fun()=>print('MA'); } mixin MB { fun()=>print('MB'); } class A extends S with MA,MB {} class B extends S with MB,MA {} ====== main() { A a = A(); a.fun(); B b = B(); b.fun(); } ===== MB MA
mixin
可以實(shí)現(xiàn)蕾絲多重繼承的功能,但是多重繼承中相同函數(shù)執(zhí)行并不會(huì)存在父子關(guān)系mixin
會(huì)最先執(zhí)行runtimeType
)都能匹配上,即子類擁有所有mixin
類的特性看完上述內(nèi)容,是不是對(duì)Flutter中Dart的Mixin的用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:Flutter中Dart的Mixin的用法
文章轉(zhuǎn)載:http://chinadenli.net/article16/gehpgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、虛擬主機(jī)、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)