前言
與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特點
- mixin 沒有構(gòu)造函數(shù),不能被實例化
- 可以當做接口使用,class 混入之后需要實現(xiàn)
- 可以使用on 指定混入的類類型,如果不是報錯。
- 如果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{ }