简介
个别状况要扩大一个类,须要继承这个类,这是在大多数 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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!