Flutter之-dart基礎mixin(一)

前言

mixin是dart2.1版本之后引入的新的語法特性,它和abstract功能差不多堤器,但是又比abstract有更多的特性颖御。接下來通過代碼來分別講述abstract和mixin的區(qū)別

1银酬、mixin可減少實現(xiàn)多繼承時的代碼冗余

假設有一個接口Walk嘲更,它有一個walk()方法,有一個類Person要實現(xiàn)該方法揩瞪,那么用abstract和mixin的實現(xiàn)分別為:
abstract實現(xiàn)

abstract class Walk {
  walk(){}
}
// 如果是單繼承赋朦,那么這里為walk()的默認實現(xiàn)
class Animal extends Walk {

}
// 這里是實現(xiàn)接口,所以必須實現(xiàn)walk方法
class Person implements  Walk{
  @override
  walk() {
  }
}

abstract實現(xiàn)李破,它的語法特性為:
1宠哄、表示抽象類,即相當于c++中的接口嗤攻,通過implements實現(xiàn)接口毛嫉,一個類可以實現(xiàn)多個接口
2、它的方法既可以沒有函數(shù)體也可以有函數(shù)體妇菱,實現(xiàn)接口時必須要實現(xiàn)此方法否則報錯
3承粤、它也可以通過extends關鍵字實現(xiàn)單繼承(如果定義了默認方法,則子類不必實現(xiàn)該方法)

mixin實現(xiàn)

mixin Walk_mixin {
  walk() {}
}
// 因為Walk_mixin有默認實現(xiàn)闯团,所以這里可以不實現(xiàn)
class PersonMixin with Walk_mixin {
  
}

1辛臊、通過with實現(xiàn)接口,一個類可以實現(xiàn)多個接口
2房交、它的方法既可以沒有函數(shù)體也可以有函數(shù)體彻舰,當接口有函數(shù)體時類在實現(xiàn)接口時可以選擇接口的默認實現(xiàn)

所以abstract修飾的類既可以表示接口又可以用于單繼承,而mixin只能用于接口候味,其次mixin在給出了方法的默認實現(xiàn)后實現(xiàn)該接口的類可以不用再次實現(xiàn)該方法刃唤,而abstract則必須要實現(xiàn)口猜,故mixin可以減少代碼冗余
mixin和abstract不可同時使用

2、mixin不支持單繼承

abstract關鍵字在被當做接口使用時是支持繼承的透揣,即通過extends關鍵字實現(xiàn)接口的繼承,代碼如下:

// 飛翔
abstract class Flying{
  flying();
}
// 高空飛翔
abstract class HighFlying extends Flying{
  highFlying();
}
class Bird implements HighFlying {
  @override
  flying() {
    
  }
  @override
  highFlying() {
    
  }
}

上面HighFlying繼承于Flying接口川抡,所以HighFlying相當于有了兩個方法flying()和highFlying()辐真。那么Bird實現(xiàn)了HighFlying則必須實現(xiàn)這兩個方法

mixin關鍵字繼承

mixin Flying_mixin{
  flying() {
    print("Flying_mixin");
  }
}
// 高空飛翔
mixin HighFlying_mixin on Flying{
  highFlying() {}
}
// 高空飛翔;此種方式實現(xiàn)接口的多繼承是錯誤的
mixin HighFlying_mixin2 on Flying_mixin{
  highFlying();
}
class BirdMixin extends Flying with HighFlying_mixin {
  @override
  flying() {
    
  }
}

1、mixin不可繼承mixin接口崖堤,但它可以通過on關鍵字來繼承abstract class修飾的接口(可以試驗侍咱,如果將上面的HighFlying_mixin2放開,那么會報錯)
2密幔、mixin通過on關鍵字繼承class修飾的類楔脯,那么此時with后面的mixin類必須要與當前類繼承自同一父類
即這里的BirdMixin和HighFlying_mixin都繼承于Flying抽象類。

3胯甩、mixin實現(xiàn)的多個接口中有同名的方法

還是以上面圖中的繼承關系為例昧廷,假設又多了一個接口MyFlying,它里面也有一個flying();方法偎箫,那么當某個類同時實現(xiàn)Flying和MyFlying兩個接口木柬,這個類的實例調(diào)用此方法時是調(diào)用的哪個接口的方法呢?根據(jù)官方的說法淹办,有兩種情況:
1眉枕、類未實現(xiàn)接口的這個方法,那么將采用距離with關鍵字越遠的類的實現(xiàn)方法
2怜森、類實現(xiàn)了接口的這個方法速挑,那么將采用自身的實現(xiàn)

mixin Flying_mixin{
  flying() {
    print("Flying_mixin");
  }
}
mixin MyFlying_mixin {
  flying() {
    print("MyFlying ");
  }
}
class HighBird with Flying_mixin,MyFlying_mixin{
  @override
  flying() {
    super.flying();
    print("調(diào)用的方法");
  }
}

4、mixin也可以實現(xiàn)abstract class修飾的接口

假設某個mixin接口A實現(xiàn)了一個abstract class修飾的接口副硅,另外一個mixin接口B又通過on關鍵字繼承了該abstract class
修飾的接口姥宝,那么類在使用with關鍵字實現(xiàn)這兩個mixin接口時,A必須寫在B的前面想许,如下

abstract class HitTest{
  hitTest(){
    print("hitTest");
  }
}
//GestureBinding
mixin GestureBinding implements HitTest{
  @override
  hitTest() {

  }
}
//RendererBinding
mixin RendererBinding on HitTest{
  @override
  hitTest() {
    // TODO: implement hitTest
    return super.hitTest();
  }
}
// 因為with關鍵字和implement關鍵字不能同時使用伶授,這里采用取巧的辦法,通過Mixin來實現(xiàn)接口流纹,然后
// 用with實現(xiàn)這個mixin接口糜烹,這樣相當于類間接實現(xiàn)了接口
class WidgetsFlutterBinding with GestureBinding,RendererBinding {
  @override
  hitTest() {
    // TODO: implement hitTest
    return super.hitTest();
  }
}

前面說到mixin通過on關鍵字繼承abstract class修飾的接口時,當被類繼承時二者必須繼承于同一個類漱凝,否則會報錯疮蹦,這里給出了另外一種寫法,即如果mixin實現(xiàn)了abstract class修飾的類茸炒,那么就相當于默認實現(xiàn)了類也繼承了這個
abstract class修飾的類

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愕乎,一起剝皮案震驚了整個濱河市阵苇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌感论,老刑警劉巖绅项,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異比肄,居然都是意外死亡快耿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門芳绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掀亥,“玉大人,你說我怎么就攤上這事妥色√禄ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵嘹害,是天一觀的道長撮竿。 經(jīng)常有香客問我,道長吼拥,這世上最難降的妖魔是什么倚聚? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮凿可,結果婚禮上惑折,老公的妹妹穿的比我還像新娘。我一直安慰自己枯跑,他們只是感情好惨驶,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敛助,像睡著了一般粗卜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纳击,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天续扔,我揣著相機與錄音,去河邊找鬼焕数。 笑死纱昧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的堡赔。 我是一名探鬼主播识脆,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灼捂?” 一聲冷哼從身側響起离例,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悉稠,沒想到半個月后宫蛆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡的猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年洒扎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衰絮。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖磷醋,靈堂內(nèi)的尸體忽然破棺而出猫牡,到底是詐尸還是另有隱情,我是刑警寧澤邓线,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布淌友,位于F島的核電站,受9級特大地震影響骇陈,放射性物質(zhì)發(fā)生泄漏震庭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一你雌、第九天 我趴在偏房一處隱蔽的房頂上張望器联。 院中可真熱鬧,春花似錦婿崭、人聲如沸拨拓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渣磷。三九已至,卻和暖如春授瘦,著一層夾襖步出監(jiān)牢的瞬間醋界,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工提完, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留形纺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓氯葬,卻偏偏與公主長得像挡篓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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