简介
个别状况要扩大一个类,须要继承这个类,这是在大多数java或者其余面向对象语言中要做的事件。
然而有些时候扩大类并不是特地好用,首先在有些语言中,有些类是禁止被扩大的。即便能够被扩大,然而扩大之后的类是一个新的类,而不是原来的父类,所以在应用的过程中可能会呈现一些类型转换的问题。
那么在dart中是怎么解决这个问题的呢?
dart中extension的应用
dart在2.7之后,引入了extension,用来对类的办法进行扩大。
到底怎么扩大呢?咱们举个例子.
咱们能够将字符串转换为int,通过调用int的parse办法,如下所示:
int.parse('18')
然而通过int类来进行转换通常不太直观,咱们心愿可能在String类中提供一个toInt的办法,能够间接调用,将字符串转换成为int。
'18'.toInt()
然而很遗憾,String并没有提供toInt的办法,所以咱们能够通过extension来对String进行扩大:
extension StringToNumber on String { int toInt() { return int.parse(this); } // ···}
如果这个文件的名字叫做string_to_number.dart,那么咱们能够这样应用:
import 'string_to_number.dart';// ···print('18'.parseInt());
dart中办法扩大最为不便的是,你只有引入对应的lib,应用的时候甚至都不晓得在应用lib的扩大。
当然,并不是所有的类都能够应用extention进行扩大。比方dynamic类型就不能进行扩大。
然而应用var类型,只有该类型能够被推断进去,那么就能够应用extention扩大。
API抵触
既然能够对lib进行扩大,那么就有可能呈现API抵触的状况。那么怎么解决API抵触呢?
比方咱们须要应用两个lib扩大文件,extention1.dart和extention2.dart.然而两个扩大文件中都定义了parseInt办法对String进行扩大。
如果同时援用的话,就会呈现问题。
这时候能够应用show或者hide来限度具体应用哪一个扩大文件的中的办法。
import 'extention1.dart';import 'extention2.dart' hide StringToNumber2;print('18'.parseInt());
还有一种状况就是显示调用extension,如下所示:
import 'extention1.dart';import 'extention2.dart';print(StringToNumber('18').parseInt());print(StringToNumber2('18').parseInt());
通过extention的名字来进行辨别。
如果两个extention的名字也雷同的话,那么能够通过prefix来进行辨别:
import 'extention1.dart';import 'extention2.dart' as ext2;print(StringToNumber('18').parseInt());print(ext2.StringToNumber('18').parseInt());
extention的实现
实现扩大很简略,实现语法如下:
extension <extension name> on <type> { (<member definition>)*}
上面是一个扩大String的例子:
extension NumberParsing on String { int parseInt() { return int.parse(this); } double parseDouble() { return double.parse(this); }}
extension还能够扩大泛型参数:
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)];}
下面的实现是对List<T> 进行扩大,增加了getter,操作符和split办法。
总结
以上就是2.7的新个性,类的扩大。
本文已收录于 http://www.flydean.com/26-dart-extension-method/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!