91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flutter中Dart的Mixin的用法

發布時間:2020-07-28 14:22:33 來源:億速云 閱讀:337 作者:小豬 欄目:移動開發

這篇文章主要講解了Flutter中Dart的Mixin的用法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

這里補充一下Mixin的定義:
只要一個類是繼承自Object的而且沒有定義構造方法,那么這個類可以是一個Mixin了。當然,如果你想讓mixin的定義更加的清晰,可以使用mixin關鍵字開頭來定義。具體請參考這里

原文截圖體會一下風格。

Flutter中Dart的Mixin的用法

正文

在經典的面向對象編程語言里一定會有常規的類,抽象類和接口。當然,Dart也有它自己的接口,不過那是另外的文章要說的。有的時候陰影里潛伏者另外的野獸:Mixin!這是做什么的,如何使用?我們來一起發現。

沒有mixin的世界

假設你在構建一個模擬野生動物的app,那么你需要一個Mosquito(蚊子)類。作為一個有預見性的開發人員,你會抽象蚊子們有的共通的東西然后放在一個抽象類里。

abstract class Insect {
 void crawl() {
 print('crawling');
 }
}

abstract class AirborneInsect extends Insect {
 void flutter() {
 print('fluttering');
 }

 void buzz() {
 print('buzzing annoyingly')
 }
}

class Mosquito extends AirborneInsect {
 void doMosquitoThing() {
 crawl();
 flutter();
 buzz();
 print('sucking blood');
 }
}

很棒!你已經做到了!添加新的昆蟲就如同微風拂過一樣,根本不會有代碼的冗余出現。。。一直到你發現你需要一個Swallow類(就是一種可以吃掉整個蚊子的東西)。

同樣的也有很多鳥類共有的東西,我們可以創建一個Bird類。這個時候問題就出現了 -- 鳥也會振動翅膀!但是,你沒法把flutter方法從AirboneInsect類里面提取出來組成一個新的類Fluttering。

為什么?Bird類可以繼承Fluttering類,但是AirboneInsect不可以,它已經繼承了Insect類了。Dart可不支持多繼承(真很好)。

這下,你需要給Bird類添加一個flutter方法了。代碼冗余發生了!

abstract class Bird {
 void chirp() {
 print('chirp chirp');
 }

 // Duplicate method
 void flutter() {
 print('fluttering');
 }
}

class Swallow extends Bird {
 void doSwallowThing() {
 chirp();
 flutter();
 print('eating a mosquito');
 }
}

使用mixin

Mixin的定義是“一種把類代碼用在多個繼承樹的方法”。簡單的說,mixin讓你不用繼承就可以引入代碼塊的方法。聲明一個mixin非常的簡單:

mixin Fluttering {
 void flutter() {
 pring('fluttering');
 }
}

這個mixin可以用在常規的類上面也可以用在抽象類,只需要一個with關鍵字。在野生動物模擬app例子里,你也許要用在抽象類上了。

mixin Fluttering {
 void flutter() {
 print('fluttering');
 }
}

abstract class Insect {
 void crawl() {
 print('crawling');
 }
}

abstract class AirborneInsect extends Insect with Fluttering {
 void buzz() {
 print('buzzing annoyingly');
 }
}

class Mosquito extends AirborneInsect {
 void doMosquitoThing() {
 crawl();
 flutter();
 buzz();
 print('sucking blood');
 }
}

abstract class Bird with Fluttering {
 void chirp() {
 print('chirp chirp');
 }
}

class Swallow extends Bird {
 void doSwallowThing() {
 chirp();
 flutter();
 print('eating a mosquito');
 }
}
也可以在一個類上面使用多個mixin。如果需要在Bird類上用一個chirping mixn的話,就和Fluttering mixin一起用就好。

abstract class Bird with Fluttering, Chirping

限制Mixin的使用

有的時候你不想讓mixin用在早已存在的類上面,你只是想讓它用在某些特定的類或者其子類上。這通常你的代碼對早已存在的代碼有依賴。

在野生動物app這個例子里,你發現僅僅支持swallow已經不夠了。還有其他種類的鳥比如麻雀或者Blue Jay等。與麻雀不同,很多其他的鳥需要從地里面啄食,種子啊,蟲子啊的。。。

給Bird抽象類添加方法是不可能的,因為不是所有的鳥都需要啄食。所以,為了避免代碼冗余,你可以創建一個叫做Pecking的mixin。

mixin Pecking {
 void peck() {
 print('pecking');
 }
}

這至少比代碼榮譽好很多了。但是,也會有人把這個mixin用在Insect類上。這樣使用mixin問題就大了。

當你開始研究一個鳥類的動作的時候,你會發現鳥兒在逐出食物之后就會發出愉悅的鳥鳴。從當前的mixin里面調用chirp方法是不可能的。要改也非常簡單,只要告訴Dart,Pecking mixin只能用在Bird類上面。現在調用Bird類的方法就沒有問題了。

//...
mixin Pecking on Bird {
 void peck() {
 print('pecking');
 chirp();
 }
}

class Sparrow extends Bird with Pecking {}

class BlueJay extends Bird with Pecking {}

結論

Mixin對于繼承體系中避免代碼的冗余非常有用處。mixin也可以被約束在只可以用在某些特定的類上面,這讓他們成為了開發的一大利器!

ps:下面在看下Flutter/Dart mixin類的理解

mixin是將一些有共同特性的類抽出來共用,把具體的特性封裝成一個mixin供其他類使用。本質上是為了減少代碼冗余。而implement也能實現這種功能,但是繼承自implement的子類需要完全重寫父類的所有屬性與方法,這就造成了很多不必要的代碼冗余。

mixin在使用上有如下特點:

mixin在定義時可以使用on關鍵字指定使用范圍

mixin swim on fish {
 //具體實現
}

當多個mixin函數一樣時,后一個mixin會覆蓋前面一個(線性特征)

class S {
 fun()=>print('A');
}
mixin MA {
 fun()=>print('MA');
}
mixin MB {
 fun()=>print('MB');
}
class A extends S with MA,MB {}
class B extends S with MB,MA {}
======
main() {
A a = A();
a.fun();
B b = B();
b.fun();
}
=====
MB
MA
  • mixin可以實現蕾絲多重繼承的功能,但是多重繼承中相同函數執行并不會存在父子關系
  • mixin實現了一條繼承鏈,聲明的順序代表了繼承的順序,聲明在后面的mixin會最先執行
  • 而最終的子類與該繼承鏈上所有類的類型(runtimeType)都能匹配上,即子類擁有所有mixin類的特性

看完上述內容,是不是對Flutter中Dart的Mixin的用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

遂溪县| 栾川县| 梁平县| 辉县市| 县级市| 穆棱市| 正镶白旗| 盘锦市| 逊克县| 二连浩特市| 九江市| 贺兰县| 合水县| 富源县| 临桂县| 卓资县| 隆尧县| 广德县| 石柱| 德庆县| 白河县| 鄄城县| 龙陵县| 鹿泉市| 本溪市| 汉川市| 丰都县| 吉木乃县| 泉州市| 佛冈县| 年辖:市辖区| 唐海县| 东至县| 昌平区| 老河口市| 韶关市| 高陵县| 洛浦县| 丽江市| 长治县| 类乌齐县|