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

語言: CN / TW / HK

前言

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

場景來展示mixin如何使用

由於在java&kotlin中經常性的用extent & implements 並不知道mixin是如何使用,那麼我舉幾個特殊的例子來幫助大家理解

場景用例

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

```bash 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 類 不希望作為常規類被使用,使用關鍵字 mixin 替換 class 。

bash mixin Fly{ void fly() { print('我會飛'); } } 如果 Fly 類 只希望限定於鳥類去使用,那麼需要加入如下關鍵字

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

```

mixin特點

  1. mixin 沒有建構函式,不能被例項化
  2. 可以當做介面使用,class 混入之後需要實現
  3. 可以使用on 指定混入的類型別,如果不是報錯。
  4. 如果with後的多個類中有相同的方法,如果當前使用類重寫了該方法,就會呼叫當前類中的方法。如果當前使用類沒有重寫了該方法,則會呼叫距離with關鍵字最遠類中的方法。

呼叫順序展示

簡單順序呼叫

如果with後的多個類中有相同的方法,如果當前使用類重寫了該方法,就會呼叫當前類中的方法。如果當前使用類沒有重寫了該方法,則會呼叫距離with關鍵字最遠類中的方法。 ```bash 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 {

} 呼叫:bash Son son = Son(); son.doPrint(); 列印:bash Second ``` 重寫後呼叫

bash class Son extends Father with First,Second { void doPrint() { print('Son'); } } 呼叫: bash Son son = Son(); son.doPrint(); 列印: bash Son

帶有父類方法呼叫

```bash 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'); } } 呼叫:bash Son().init(); 列印:bash 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| 混入該類內容| | with on |mixin| 混入該類內容,但必須是特點的型別|

特別注意

mixin 可以on多個類,但with時候之前的類必須已經有相關的實現 bash mixin Mix on Mix1,Mix2{ }