Mixins are a way of reusing a class’s code in multiple class hierarchies.
Mixin 是一種在多個類層次結構中重用類代碼的方法。
Mixin 有利於代碼重用以及避免了多繼承的複雜,是帶有實作的 interface
。
有一個 SuperHero 抽象類如下:
abstract class SuperHero {
bool isStrong = true;
void fly(){
print('Flying');
}
void runFast(){
print('Run fast');
}
}
→ 繼承這個類的 SuperHero 都會具備這些能力
class Superman extends SuperHero{}
void main(){
final superman = Superman();
superman.fly();
superman.runFast();
print(superman.isStrong());
}
// Flying
// Run fast
// true
class AquaMan extends SuperHero{
void waterBreath(){
print('Can breath in water');
}
}
為我們將 AquaMan 的能力擷取出來,新增一個抽象類 UnderWaterSuperHero,並將擷取出的能力置入。
abstract class UnderWaterSuperHero extends SuperHero{
void waterBreath(){
print('Can breath in water');
}
}
class AquaMan extends UnderWaterSuperHero{}
void main(){
final aquaMan = AquaMan();
aquaMan.fly();
aquaMan.runFast();
print(superman.isStrong());
aquaMan.waterBreath();
}
// Flying
// Run fast
// true
// Can breath in water
我們將屬性、方法定義在抽象類裡面,當需要新增屬性或是方法時,若修改原本繼承的抽象類,有可能會影響到其他繼承該類別的子類別。
如上面範例的 AquaMan 類。
將 AquaMan 的能力改由 mixin
定義
mixin UnderWater{
void waterBreath(){
print('Can breath in water');
}
}
利用關鍵字 with
將 mixin引入。
並將 AquaMan 類改為:
class AquaMan extends SuperHero with UnderWater{}
extends
只能繼承一個類別,而 with
可以引入多個 mixin
將屬性、方法定義在 mixin
中,可以直接與任意類別 「混合」,如此,增加了程式的彈性。
例如:
有一個 Animal 的類別,我們想增加一個 UnderWaterAnimal 類,我們就可以直接使用前面所定義的 mixin UnderWater
class Animal with UnderWater{}
如果要限制 mixin
只能給特定的類使用,使用關鍵字 on
。
mixin UnderWater on SuperHero{
void waterBreath(){
print('Can breath in water');
}
}
mixin
就是含有實作的 interface,利用 mixin
我們可以將依賴反轉。
一個類別可以用 with
引入多個 mixin
。
關鍵字 on
可以限制 mixin
只能提供給特定的類別使用。