深入理解Dart之Mixins

在面向?qū)ο蟮氖澜缰校覀冏钍煜さ哪^于classabstract classinterface撮抓。Dart作為一門現(xiàn)代面向?qū)ο缶幊陶Z言衷畦,在原有的特性基礎上栗涂,新增了一些新的特性,今天我們就來聊聊 Mixins祈争。

什么是Mixins

在官方文檔中斤程,我們可以看到對Mixins的解釋是:

Mixins are a way of reusing a class’s code in multiple class hierarchies.

簡單的理解,就是用來復用多個類之間的代碼菩混,減少耦合忿墅。我們直接來看一個例子。

沒有Mixins的從前

假設沮峡,我們現(xiàn)在正在開發(fā)一個動物大全App疚脐,我們需要創(chuàng)建一個Duck類。作為一個有豐富面向?qū)ο缶幊探?jīng)驗的開發(fā)者邢疙,你自然的將所有和Duck有相似特征的抽取成一個abstract class棍弄。

/// Bird
abstract class Bird {
    void shout() {
        println('shouting');
    }
}

/// WaterborneBird
abstract class WaterborneBird extends Bird {
    void swim() {
        println('swimming');
    }
}

/// Duck
class Duck extends WaterborneBird {
    void doDuckThings() {
        shout();
        swim();
        println('quack quack quack!')
    }
}

很好望薄,我們清楚的將鴨子歸入水中生活的鳥類,加入其它的鳥類也變得非常容易照卦。但是式矫,現(xiàn)在我們需要加入金魚了,于是我們和上面一樣編寫代碼役耕。

/// Fish
abstract class Fish {
    void swim() {
        println("swimming")
    }
}

/// GoldFish
class GoldFish extends Fish {
    void doGoldFishThings() {
        swim();
        pringln('zzz...');
    }
}

這是我們發(fā)現(xiàn)金魚和鴨子一樣擁有swim的特性采转,在這個例子中是非常簡單的,但是如果我們有復雜的行為需要賦予給一個新的類瞬痘,我們就要大量編寫重復的代碼了故慈。

使用Mixins

我們聲明一個Swimming的mixin:

mixin Swimming {
    void swim() {
        println('swimming')
    }
}

我們可以使用with關鍵字將mixin加入到class中,其實看到這里你可能已經(jīng)回想到我們其實可能已經(jīng)用過這個with關鍵字了框全。接下來察绷,我們就可以對上面的代碼進行改造了:

/// Bird
abstract class Bird {
    void shout() {
        println('shouting');
    }
}


/// Duck
class Duck extends Bird with Swimming {
    void doDuckThings() {
        shout();
        swim();
        println('quack quack quack!')
    }
}
/// Fish
abstract class Fish {

}

/// GoldFish
class GoldFish extends Fish with Swimming {
    void doGoldFishThings() {
        swim();
        pringln('zzz...');
    }
}

另外,你可以將多個mixins放入同一個類中津辩,而且dart對這個數(shù)量沒有作任何限制拆撼。

其它

關于Mixins,還有很多需要注意的事情喘沿,我們雖然可以使用Mixins對代碼進行一些簡化闸度,但是要建立在對需求和類之間的關系準確理解的基礎上。建議多去看看Flutter中使用Mixins實現(xiàn)的一些源碼蚜印,從里面吸取一些正確的經(jīng)驗莺禁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窄赋,隨后出現(xiàn)的幾起案子哟冬,更是在濱河造成了極大的恐慌,老刑警劉巖忆绰,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浩峡,死亡現(xiàn)場離奇詭異,居然都是意外死亡错敢,警方通過查閱死者的電腦和手機红符,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伐债,“玉大人预侯,你說我怎么就攤上這事》逅” “怎么了萎馅?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虹蒋。 經(jīng)常有香客問我糜芳,道長飒货,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任峭竣,我火速辦了婚禮塘辅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皆撩。我一直安慰自己扣墩,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布扛吞。 她就那樣靜靜地躺著呻惕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滥比。 梳的紋絲不亂的頭發(fā)上亚脆,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音盲泛,去河邊找鬼濒持。 笑死,一個胖子當著我的面吹牛寺滚,可吹牛的內(nèi)容都是我干的柑营。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼玛迄,長吁一口氣:“原來是場噩夢啊……” “哼由境!你這毒婦竟也來了棚亩?” 一聲冷哼從身側(cè)響起蓖议,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讥蟆,沒想到半個月后勒虾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡瘸彤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年修然,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片质况。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡愕宋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出结榄,到底是詐尸還是另有隱情中贝,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布臼朗,位于F島的核電站邻寿,受9級特大地震影響蝎土,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绣否,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一誊涯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒜撮,春花似錦暴构、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至薇溃,卻和暖如春菌赖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沐序。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工琉用, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人策幼。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓邑时,卻偏偏與公主長得像,于是被迫代替她去往敵國和親特姐。 傳聞我的和親對象是個殘疾皇子晶丘,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Flutter日漸火爆,因此在進行Flutter學習前先學習一些其所使用的開發(fā)語言dart的基礎唐含,這篇文章主要學習...
    Samlss閱讀 10,924評論 2 28
  • Dart我們有不得不學的理由浅浮,因為有Flutter這尊大神在啊,但是像有的大神這樣瀟灑捷枯,現(xiàn)階段我還做不到 如果您熟...
    前行的烏龜閱讀 2,280評論 0 12
  • 1滚秩、前言: 最近在學習Flutter,作為Flutter的編程語言淮捆,Dart語言語法的學習自然就編程重中之重郁油。本文...
    Yagami3zZ閱讀 1,497評論 0 0
  • 解決辦法:根據(jù)下面圖片打開這個文件,注釋掉報錯的代碼就好了攀痊。 這個錯誤其實就是這個 AlipayPackgae 實...
    Lane_Feidor閱讀 676評論 0 50
  • “你叫什么名字桐腌?” “我叫強強」毒叮” “你哥叫什么名字案站?” “小哥哥叫壯壯∩裕” “強壯強壯嚼吞,應該你哥叫強盒件,你叫壯才對...
    忙里偷閑追夢依然閱讀 791評論 13 29