跟我學flutter:我們來舉個例子通俗易懂講解dart 中的 mixin

前言

與java&kotlin不同的是,dart中有一個特殊的關(guān)鍵字mixin(mix-in),用這個關(guān)鍵字的類被其他類(包含)的時候,其他類就擁有了該類的方法。這樣代碼不通過繼承(extend)就可以重用。

場景來展示mixin如何使用

由于在java&kotlin中經(jīng)常性的用extent & implements 并不知道m(xù)ixin是如何使用,那么我舉幾個特殊的例子來幫助大家理解

場景用例

在這里插入圖片描述

如上uml圖所示
鳥作為父類,鳥必備的技能為(下蛋和走路),而作為其子類的大雁和麻雀可以飛行,企鵝卻不能飛行。
那么飛行卻成為個別鳥類的技能,如果在父類中定義實現(xiàn)飛,那在企鵝中就多了個空實現(xiàn)。如果定義一個接口實現(xiàn)飛,那么在能飛的鳥類中就必須都要重新編寫飛的代碼。如何讓這一切變得容易呢。
那么我們用混入(with)來實現(xiàn)如下代碼:

abstract class Bird{

     void walk() { print('我會走路'); } 
     void xiadan() { print('我會下蛋'); } 
} 

abstract class Fly{
     void fly() { print('我會飛'); } 
} 

//大雁

class Dayan extends Bird with Fly {} 

 //企鵝

class Qier extends Bird {}

如果 Fly 類 不希望作為常規(guī)類被使用,使用關(guān)鍵字 mixin 替換 class 。

mixin Fly{
  void fly() { print('我會飛'); }
}

如果 Fly 類 只希望限定于鳥類去使用,那么需要加入如下關(guān)鍵字

mixin Fly on Bird{
  void fly() { print('我會飛'); }
}

mixin特點

  1. mixin 沒有構(gòu)造函數(shù),不能被實例化
  2. 可以當做接口使用,class 混入之后需要實現(xiàn)
  3. 可以使用on 指定混入的類類型,如果不是報錯。
  4. 如果with后的多個類中有相同的方法,如果當前使用類重寫了該方法,就會調(diào)用當前類中的方法。如果當前使用類沒有重寫了該方法,則會調(diào)用距離with關(guān)鍵字最遠類中的方法。

調(diào)用順序展示

簡單順序調(diào)用

如果with后的多個類中有相同的方法,如果當前使用類重寫了該方法,就會調(diào)用當前類中的方法。如果當前使用類沒有重寫了該方法,則會調(diào)用距離with關(guān)鍵字最遠類中的方法。

abstract class First {
  void doPrint() {
    print('First');
  }
}
 
abstract class Second {
  void doPrint() {
    print('Second');
  }
}
 
class Father {
  void doPrint() {
    print('Father');
  }
}
 
class Son extends Father with First,Second {
 
}

調(diào)用:

    Son son = Son();
    son.doPrint();

打?。?/p>

Second

重寫后調(diào)用

class Son extends Father with First,Second {
   void doPrint() {
    print('Son');
  }
}

調(diào)用:

    Son son = Son();
    son.doPrint();

打印:

Son

帶有父類方法調(diào)用

class Father {
  void init() {
    print('Father init');
  }
}
mixin FirstMixin on Father {
  void init() {
    print('FirstMixin init start');
    super.init();
    print('FirstMixin init end');
  }
}
 
mixin SecondMixin on Father {
  void init() {
    print('SecondMixin init start');
    super.init();
    print('SecondMixin init end');
  }
}
 
 
class Son extends Father with FirstMixin, SecondMixin {
 
  @override
  void init() {
    print('Son init start');
    super.init();
    print('Son init end');
  }
}

調(diào)用:

  Son().init();

打?。?/p>

flutter: Son init start
flutter: SecondMixin init start
flutter: FirstMixin init start
flutter: Father init
flutter: FirstMixin init end
flutter: SecondMixin init end
flutter: Son init end

說明

方式 類型 說明
with mixin 混入該類內(nèi)容
with on mixin 混入該類內(nèi)容,但必須是特點的類型

特別注意

mixin 可以on多個類,但with時候之前的類必須已經(jīng)有相關(guān)的實現(xiàn)

mixin Mix on Mix1,Mix2{ }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容