简介

个别状况要扩大一个类,须要继承这个类,这是在大多数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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

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