實踐類工做常常會遇到這樣的問題,有些概念會用不會說,最近在學習Dart,遇到mixin
即是如此。讀了幾篇網文總以爲參差不齊,一羣碼友也說越讀越懵,索性靜下心來從新出發,一點一滴地弄明白。記錄下來分享給你們,咱不說別人文筆很差、也很少舉例子以致忘了初心,咱就看能不能以最直觀的示例和最直白的講解達到快速理解mixin
的目的。前端
Mix in: (Phrasal Verb) Mix something in/with something. To add one substance to others, especially in cooking.
-- Oxford Advanced American Dictionary程序員
Mix in
本意主要是指烹飪時將一種東西混進另外一種東西,好比打個雞蛋,放點兒鹽,一塊兒攪。把這個概念搬到Dart這門單繼承的面嚮對象語言中來又是幾個意思呢?數據庫
根子就在單繼承上,這能夠說是現代編程語言的「政治正確」,但它在帶來好處的同時也限制了想象空間。廢話少說,以碼服人:編程
abstract class DeveloperBase { void code(); } class FrontEndDeveloper extends DeveloperBase { void code() => print('我在幫組裏小姐姐寫代碼'); } mixin Zhuangbility on FrontEndDeveloper { @override void code() => print('寫代碼講究的是情懷'); void operateDatabase() => print('大不了老子刪庫跑路'); } class FullStackDeveloper extends FrontEndDeveloper with Zhuangbility {} void main() { FullStackDeveloper fullStackDeveloper = FullStackDeveloper(); fullStackDeveloper.code(); fullStackDeveloper.operateDatabase(); }
首先咱們籠統地定義了一個程序員基類DeveloperBase
,程序員寫程序,天經地義,沒啥好說的。而後咱們基於DeveloperBase
定義了只要有機會就喜歡幫小姐姐幹活兒的前端程序員類FrontEndDeveloper
。後端
如今,咱們實際上就能夠用FrontEndDeveloper
來幹活兒了,可是單就一個前端程序員,刷子畢竟不夠,假如咱們須要一個可以主持全面工做的全棧程序員,咋整?定義一個全棧程序員類FullStackDeveloper
,無論它繼承自DeveloperBase
仍是FrontEndDeveloper
,彷佛都不夠;定義一個後端程序員類BackEndDeveloper
讓FullStackDeveloper
來繼承,又是魚和熊掌不可兼得的問題,畢竟單繼承機制不給你這個想象空間。編程語言
因此,這種時候就得換個思路了。用mixin
來聲明一種混入,爲了不形成困擾,咱不叫它BackEndDeveloper
而命名爲高階能力Zhuangbility
,將一組新的技能混入FrontEndDeveloper
,而後就能夠聲明前端程序員出身、帶有高階能力,既能寫代碼又會玩弄數據庫的FullStackDeveloper
了。ide
> dart main.dart ↙ 寫代碼講究的是情懷 大不了老子刪庫跑路