dart 系列之: 你的地盘你做主, 使用 Extension 对类进行扩展
简介
一般情况要扩展一个类,需要继承这个类,这是在大多数 java 或者其他面向对象语言中要做的事情。
但是有些时候扩展类并不是特别好用,首先在有些语言中,有些类是禁止被扩展的。即使可以被扩展,但是扩展之后的类是一个新的类,而不是原来的父类,所以在使用的过程中可能会出现一些类型转换的问题。
那么在 dart 中是怎么解决这个问题的呢?
dart 中 extension 的使用
dart 在 2.7 之后,引入了 extension,用来对类的方法进行扩展。
到底怎么扩展呢?我们举个例子.
我们可以将字符串转换为 int,通过调用 int 的 parse 方法,如下所示:
但是通过 int 类来进行转换通常不太直观,我们希望能够在 String 类中提供一个 toInt 的方法,可以直接调用,将字符串转换成为 int。
但是很遗憾,String 并没有提供 toInt 的方法,所以我们可以通过 extension 来对 String 进行扩展:
如果这个文件的名字叫做 string_to_number.dart,那么我们可以这样使用:
dart 中方法扩展最为方便的是,你只要引入对应的 lib,使用的时候甚至都不知道在使用 lib 的扩展。
当然,并不是所有的类都可以使用 extention 进行扩展。比如 dynamic 类型就不能进行扩展。
但是使用 var 类型,只要该类型可以被推断出来,那么就可以使用 extention 扩展。
API 冲突
既然可以对 lib 进行扩展,那么就有可能出现 API 冲突的情况。那么怎么解决 API 冲突呢?
比如我们需要使用两个 lib 扩展文件,extention1.dart 和 extention2.dart.但是两个扩展文件中都定义了 parseInt 方法对 String 进行扩展。
如果同时引用的话,就会出现问题。
这时候可以使用 show 或者 hide 来限制具体使用哪一个扩展文件的中的方法。
还有一种情况就是显示调用 extension,如下所示:
通过 extention 的名字来进行区分。
如果两个 extention 的名字也相同的话,那么可以通过 prefix 来进行区分:
extention 的实现
实现扩展很简单,实现语法如下:
下面是一个扩展 String 的例子:
extension 还可以扩展泛型参数:
上面的实现是对 List<T> 进行扩展,添加了 getter,操作符和 split 方法。
总结
以上就是 2.7 的新特性,类的扩展。
本文已收录于 http://www.flydean.com/26-dart-extension-method/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
版权声明: 本文为 InfoQ 作者【程序那些事】的原创文章。
原文链接:【http://xie.infoq.cn/article/836c82fb4ba1d4081600910b5】。文章转载请联系作者。
评论