dart系列之:你的地盘你做主,使用Extension对类进行扩展
文章目錄
- 簡介
- dart中extension的使用
- API沖突
- extention的實現(xiàn)
- 總結(jié)
簡介
一般情況要擴(kuò)展一個類,需要繼承這個類,這是在大多數(shù)java或者其他面向?qū)ο笳Z言中要做的事情。
但是有些時候擴(kuò)展類并不是特別好用,首先在有些語言中,有些類是禁止被擴(kuò)展的。即使可以被擴(kuò)展,但是擴(kuò)展之后的類是一個新的類,而不是原來的父類,所以在使用的過程中可能會出現(xiàn)一些類型轉(zhuǎn)換的問題。
那么在dart中是怎么解決這個問題的呢?
dart中extension的使用
dart在2.7之后,引入了extension,用來對類的方法進(jìn)行擴(kuò)展。
到底怎么擴(kuò)展呢?我們舉個例子.
我們可以將字符串轉(zhuǎn)換為int,通過調(diào)用int的parse方法,如下所示:
int.parse('18')但是通過int類來進(jìn)行轉(zhuǎn)換通常不太直觀,我們希望能夠在String類中提供一個toInt的方法,可以直接調(diào)用,將字符串轉(zhuǎn)換成為int。
'18'.toInt()但是很遺憾,String并沒有提供toInt的方法,所以我們可以通過extension來對String進(jìn)行擴(kuò)展:
extension StringToNumber on String {int toInt() {return int.parse(this);}// ··· }如果這個文件的名字叫做string_to_number.dart,那么我們可以這樣使用:
import 'string_to_number.dart'; // ··· print('18'.parseInt());dart中方法擴(kuò)展最為方便的是,你只要引入對應(yīng)的lib,使用的時候甚至都不知道在使用lib的擴(kuò)展。
當(dāng)然,并不是所有的類都可以使用extention進(jìn)行擴(kuò)展。比如dynamic類型就不能進(jìn)行擴(kuò)展。
但是使用var類型,只要該類型可以被推斷出來,那么就可以使用extention擴(kuò)展。
API沖突
既然可以對lib進(jìn)行擴(kuò)展,那么就有可能出現(xiàn)API沖突的情況。那么怎么解決API沖突呢?
比如我們需要使用兩個lib擴(kuò)展文件,extention1.dart和extention2.dart.但是兩個擴(kuò)展文件中都定義了parseInt方法對String進(jìn)行擴(kuò)展。
如果同時引用的話,就會出現(xiàn)問題。
這時候可以使用show或者h(yuǎn)ide來限制具體使用哪一個擴(kuò)展文件的中的方法。
import 'extention1.dart';import 'extention2.dart' hide StringToNumber2;print('18'.parseInt());還有一種情況就是顯示調(diào)用extension,如下所示:
import 'extention1.dart';import 'extention2.dart';print(StringToNumber('18').parseInt()); print(StringToNumber2('18').parseInt());通過extention的名字來進(jìn)行區(qū)分。
如果兩個extention的名字也相同的話,那么可以通過prefix來進(jìn)行區(qū)分:
import 'extention1.dart';import 'extention2.dart' as ext2;print(StringToNumber('18').parseInt()); print(ext2.StringToNumber('18').parseInt());extention的實現(xiàn)
實現(xiàn)擴(kuò)展很簡單,實現(xiàn)語法如下:
extension <extension name> on <type> {(<member definition>)* }下面是一個擴(kuò)展String的例子:
extension NumberParsing on String {int parseInt() {return int.parse(this);}double parseDouble() {return double.parse(this);} }extension還可以擴(kuò)展泛型參數(shù):
extension MyFancyList<T> on List<T> {int get doubleLength => length * 2;List<T> operator -() => reversed.toList();List<List<T>> split(int at) => [sublist(0, at), sublist(at)]; }上面的實現(xiàn)是對List 進(jìn)行擴(kuò)展,添加了getter,操作符和split方法。
總結(jié)
以上就是2.7的新特性,類的擴(kuò)展。
本文已收錄于 http://www.flydean.com/26-dart-extension-method/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!
歡迎關(guān)注我的公眾號:「程序那些事」,懂技術(shù),更懂你!
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的dart系列之:你的地盘你做主,使用Extension对类进行扩展的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: netty系列之:从零到壹,搭建一个SO
- 下一篇: dart系列之:dart代码规范实践指南