写点什么

dart 系列之: 你的地盘你做主, 使用 Extension 对类进行扩展

作者:程序那些事
  • 2021 年 12 月 18 日
  • 本文字数:1400 字

    阅读完需:约 5 分钟

dart系列之:你的地盘你做主,使用Extension对类进行扩展

简介

一般情况要扩展一个类,需要继承这个类,这是在大多数 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/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 1 小时前阅读数: 4
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
dart系列之:你的地盘你做主,使用Extension对类进行扩展