iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0

什麼是 Mixin?

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 都會具備這些能力

  • Superman 繼承 SuperHero 類,所以擁有了 SuperHero 類的能力。
class Superman extends SuperHero{}

void main(){
	final superman = Superman();
	superman.fly();
	superman.runFast();
	print(superman.isStrong());
}

// Flying
// Run fast
// true
  • 新增一個 AquaMan類,同樣也繼承 SuperHero 類,所以也繼承了 SuperHero 的能力。
  • 但是,AquaMan 比 SuperMan 類多了一項能力:waterBreath()。
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');
  }
}
  • AquaMan 改繼承 UnderWaterSuperHero 類。
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 類。

Mixin

將 AquaMan 的能力改由 mixin 定義

mixin UnderWater{
  void waterBreath(){
		print('Can breath in water');	
	}
}

利用關鍵字 with將 mixin引入。

並將 AquaMan 類改為:

class AquaMan extends SuperHero with UnderWater{}
  • AquaMan 既屬於 SuperHero 類,也包含 UnderWater。

Why mixin?

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');
  }
}
  • 那麼 UnderWater 就只能被 SuperHero 類或子類別引入了。

小結

mixin就是含有實作的 interface,利用 mixin 我們可以將依賴反轉。

一個類別可以用 with 引入多個 mixin

關鍵字 on 可以限制 mixin 只能提供給特定的類別使用。


上一篇
Day 17:隱性介面 (Implicit interface)
下一篇
Day19:靜態變數 (Static variable)、靜態方法 (Static method) 以及 頂層函數 (Top-level functions)
系列文
Dart 語言 - 開啟 Flutter 的鑰匙30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言