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

4次阅读

共计 1921 个字符,预计需要花费 5 分钟才能阅读完成。

简介

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

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

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

正文完
 0