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 进行扩展,添加了getter,操作符和split方法。
总结
以上就是2.7的新特性,类的扩展。
本文已收录于 http://www.flydean.com/26-dart-extension-method/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
dart系列之:你的地盘你做主,使用Extension对类进行扩展的更多相关文章
- JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间
麦子学院/Andriod应用开发/第一阶段 Android 学前准备 第三课:Eclipse IDE 使用技巧 由马一鸣老师讲解.感谢麦子学院免费开放这部分视频资源. Eclipse由IBM开发的,2 ...
- dart系列之:dart语言中的特殊操作符
dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...
- dart系列之:时间你慢点走,我要在dart中抓住你
目录 简介 DateTime Duration 总结 简介 时间和日期是我们经常会在程序中使用到的对象.但是对时间和日期的处理因为有不同时区的原因,所以一直以来都不是很好用.就像在java中,为时间和 ...
- dart系列之:集合使用最佳实践
目录 简介 使用字面量创建集合 不要使用.length来判断集合是否为空 可遍历对象的遍历 List.from和iterable.toList where和whereType 避免使用cast 总结 ...
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...
- MyBatis系列三 之 使用getMapper剔除掉Dao的实现类
MyBatis系列三 之 使用getMapper剔除掉Dao的实现类 我们在系列一 中 我们使用的是Dao的实现类 来操作底层数据库,今天我们使用getMapper()来替换Dao的实现类, ...
- Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图
Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...
- dart系列之:dart语言中的变量
目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...
- dart系列之:dart语言中的内置类型
目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...
随机推荐
- day04 Linux基础命令
day04 Linux基础命令 查看帮助信息命令 1.man命令:man命令的功能是查看指定命令的详细解释. 格式:man [具体需要被查看的命令] [root@localhost ~]# man r ...
- 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame 2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive) 6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户
1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...
- Vue相关,vue.nextTick
vue中有一个较为特殊的API,nextTick.根据官方文档的解释,它可以在DOM更新完毕之后执行一个回调,用法如下: // 修改数据 vm.msg = 'Hello' // DOM 还没有更新 V ...
- Android 开源框架Universal-Image-Loader加载https图片
解决方案就是 需要 android https HttpsURLConnection 这个类忽略证书 1,找到 Universal-Image-Loader的library依赖包下面com.nostr ...
- cordova配置与开发
1.环境配置 1.1.安装ant 从 apache官网 下载ant,安装并配置,将ant.bat所在目录加到path环境变量,如c:\apache-ant\bin\.在cmd中运行以下语句如不报错即可 ...
- Java 使用slf4j记录日志
引入依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12< ...
- 30个类手写Spring核心原理之Ioc顶层架构设计(2)
本文节选自<Spring 5核心原理> 1 Annotation(自定义配置)模块 Annotation的代码实现我们还是沿用Mini版本的,保持不变,复制过来便可. 1.1 @GPSer ...
- 使用Navicat Premium 15发送Excel附件至个人邮箱
一.新建一个查询保存为user 二.右键查询导出向导为Excel文件并保存为user 三.点自动运行-添加查询-添加附件-高级配置邮件信息(qq邮箱需要先开启POP3/SMTP服务) 四.设置定时任务 ...
- linux小应用 —— 日志过滤
先说问题,统计一个日志文件中去重之后的ip地址的个数.其实这是一个非常常见也比较简单的问题,其中我个人认为最主要的应该是匹配ip地址是这个问题的核心.剩下的就是对linux命令的熟练程度的问题了.首先 ...
- 关于input单选框的radio属性
最近在做前端页面的时候遇到一个问题(后端php猴子前端不怎么写) 我写了一段代码: <form action=""> <label for=&quo ...