跟我學flutter:我們來舉個例子通俗易懂講解dart 中的 mixin
前言
與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特點
- mixin 沒有建構函式,不能被例項化
- 可以當做介面使用,class 混入之後需要實現
- 可以使用on 指定混入的類型別,如果不是報錯。
- 如果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{ }
- 跟我學flutter:細細品Widget(三)ProxyWidget,InheritedWidget
- 跟我學flutter:細細品Widget(一)Widget&Element初識
- 跟我學flutter:Flutter雷達圖表(一)如何使用kg_charts
- 跟我學flutter:我們來舉個例子通俗易懂講解非同步(二)ioslate迴圈機制
- 跟我學flutter:我們來舉個例子通俗易懂講解非同步(一)ioslate
- 跟我學flutter:我們來舉個例子通俗易懂講解dart 中的 mixin
- 跟我學企業級flutter專案:dio網路框架增加公共請求引數&header
- flutter 優秀dio網路攔截視覺化