简介

一般情况要扩展一个类,需要继承这个类,这是在大多数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 进行扩展,添加了getter,操作符和split方法。

总结

以上就是2.7的新特性,类的扩展。

本文已收录于 http://www.flydean.com/26-dart-extension-method/

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

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

dart系列之:你的地盘你做主,使用Extension对类进行扩展的更多相关文章

  1. JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间

    麦子学院/Andriod应用开发/第一阶段 Android 学前准备 第三课:Eclipse IDE 使用技巧 由马一鸣老师讲解.感谢麦子学院免费开放这部分视频资源. Eclipse由IBM开发的,2 ...

  2. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...

  3. dart系列之:时间你慢点走,我要在dart中抓住你

    目录 简介 DateTime Duration 总结 简介 时间和日期是我们经常会在程序中使用到的对象.但是对时间和日期的处理因为有不同时区的原因,所以一直以来都不是很好用.就像在java中,为时间和 ...

  4. dart系列之:集合使用最佳实践

    目录 简介 使用字面量创建集合 不要使用.length来判断集合是否为空 可遍历对象的遍历 List.from和iterable.toList where和whereType 避免使用cast 总结 ...

  5. 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...

  6. MyBatis系列三 之 使用getMapper剔除掉Dao的实现类

    MyBatis系列三  之  使用getMapper剔除掉Dao的实现类 我们在系列一 中 我们使用的是Dao的实现类   来操作底层数据库,今天我们使用getMapper()来替换Dao的实现类, ...

  7. Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图

    Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...

  8. dart系列之:dart语言中的变量

    目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...

  9. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

随机推荐

  1. 【Maven实战技巧】「插件使用专题」Maven-Archetype插件创建自定义maven项目骨架

    技术推荐 自定义Archetype Maven骨架/以当前项目为模板创建maven骨架,可以参考http://maven.apache.org/archetype/maven-archetype-pl ...

  2. nodejs-CommonJS规范

    JavaScript 标准参考教程(alpha) 草稿二:Node.js CommonJS规范 GitHub TOP CommonJS规范 来自<JavaScript 标准参考教程(alpha) ...

  3. Can namespaces be nested in C++?

    In C++, namespaces can be nested, and resolution of namespace variables is hierarchical. For example ...

  4. gitlab 集成openldap

    Setting up LDAP sign-in If you have an LDAP directory service such as Active Directory, you can conf ...

  5. Tableau如何绘制双柱折线组合图2

    一.数据源准备 二.创建计算字段月度-拖拽至列-右键-精确日期 CASE[指标] WHEN "同期"then DATETRUNC('day',[日期])-5 WHEN " ...

  6. 控制 Python 类的序列化过程

    问题 有的类是不支持在多进程间传递的,如果非要这么做,可能会引发奇怪的现象.比如下面这段代码: from concurrent.futures import ProcessPoolExecutor, ...

  7. UCI数据库_鸢尾花数据集的读取方式

    1. 读取数据的第一种方式 [attrib1,attrib2,attrib3,attrb4,class] = textread('iris.data','%f%f%f%f%s','delimiter' ...

  8. bcloud_bctf_2016

    目录 bcloud_bctf_2016 总结 题目分析 checksec 函数分析 main welcome get_name get_org_host menu new_note show_note ...

  9. android jni-dlerror报undefined symbol: JNI_OnLoad

    以下是很简单的一个官方的jni方法,在MainActivity的onCreate中调用 extern "C" JNIEXPORT jstring JNICALL Java_com_ ...

  10. 对QuerySet的理解

    1. 如何通过Django的Model操作数据库? 在Django的Model中,QuerySet是一个很重要的概念.因为我们同数据库的所有查询以及更新交互都是通过它来完成的. 2. Django的M ...