Kotlin属性委托系统总结与提供委托详解
属性委托总结回顾:
在前三次已经将Kotlin委托相关的知识点进行了完整的学习了,具体博文如下:
- https://www.cnblogs.com/webor2006/p/11369019.html
- https://www.cnblogs.com/webor2006/p/11369333.html
- https://www.cnblogs.com/webor2006/p/11406972.html
下面再整体完整的将其进行一下回顾,来巩固所学的知识。
关于属性委托的要求:
对于只读属性来说(val修饰的属性),委托需要提供一个名为getValue的方法,该方法接收如下参数:
- thisRef,需要是属性拥有者相同的类型或是其父类型(对于扩展属性来说,这个类型指的是被扩展的那个类型)。其中为啥是可以父类型,也可以在ReadOnlyProperty中的声明中可以体现出来:

属于逆变。
- property,需要是KProperty<*>类型或是其父类型。
getValue方法需要返回与属性相同的类型或者其子类型。其实可以在ReadOnlyProperty中的声明中可以体现出来:

属于协变。
对于可变属性来说(var修饰的属性),委托需要再提代一个名为setValue的方法,该方法需要接收如下参数:

- thisRef,与getValue方法的thisRef要求一致。
- property,与getValue方法的property要求一致。
- value,它需要与属性的类型相同或是其父类型。
getValue与setValue方法既可以作为委托类的成员方法实现,也可以作为其扩展方法来实现。
这两个方法都必须要标记为operator关键字。对于委托类来说,它可以实现ReadOnlyProperty或是ReadWriteProperty接口,这些接口包含了相应的getValue与setValue方法,瞅一下:

可以看到在Kotlin中的一个接口类中里面可以定义多个接口,这个在Java中是不允许的。
同时,对于委托来说,也可以不去实现这两个接口,而是自己单独实现相应的getValue与setValue方法。
委托转换规则:
为啥利用委托就可以实现委托的效果呢,这里就涉及到它的一些转换规则,具体如下:
对于每个委托属性来说,Kotlin编译器在底层会生成一个辅助的属性,然后将对原来属性的访问委托给这个辅助属性,比如说,对于属性prop来说,Kotlin编译器所生成的隐含的属性名为prop$delegate的属性,然后对原有的prop属性的访问器的访问都只是委托给了这个额外的,Kotlin编译器所生成的辅助属性。
提供委托(providing a delegate)【】:
先来看一下我们之前学习的属性委托:

这里提供委托就可以办到,通过定义privideDelegate operator,我们可以扩展委托的创建逻辑过程。如果对象定义了privideDelegate方法,那么该方法就会被调用来创建属性委托实例,下面用具体代码来瞅一下它的使用。
需要定义几个组件,如下:

需要定义我们的委托类,所以:

接下来则定义真正的属性委托类:

然后再调用一下:

接下来则改一下:

再运行:

因为不满足委托条件,所以利用提供委托就能达到过滤委托的作用,实际中用这种特性用得不多,但是得了解它是个什么东东。
Kotlin属性委托系统总结与提供委托详解的更多相关文章
- Kotlin——初级篇(四):控制语句详解
在前面 的章节中讲解了Kotlin语言中的数据类型.变量与常量的定义.不了解请参见前面的内容: Kotlin--初级篇(三):数据类型详解. Kotlin--初级篇(二)常量.变量.注释. 下面详细为 ...
- Linux(centos)系统各个目录的作用详解
Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码 ...
- Oracle 11g客户端在Linux系统上的配置步骤详解
Oracle 11g客户端在Linux系统上的配置步骤详解 2011-07-26 10:47 newhappy2008 CSDN博客 字号:T | T 本文我们主要介绍了Oracle 11g客户端在L ...
- Kotlin——最详细的操作符与操作符重载详解(上)
本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...
- linux(CENTOS)系统各个目录的作用详解
Linux(CentOS)系统各个目录的作用详解 文件的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.S ...
- Windows系统Git安装教程(详解Git安装过程)
Windows系统Git安装教程(详解Git安装过程) 今天更换电脑系统,需要重新安装Git,正好做个记录,希望对第一次使用的博友能有所帮助! 获取Git安装程序 到Git官网下载,网站地址: ...
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- .Net中委托的协变和逆变详解
关于协变和逆变要从面向对象继承说起.继承关系是指子类和父类之间的关系:子类从父类继承所以子类的实例也就是父类的实例.比如说Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是Do ...
- Kotlin——最详细的数据类、密封类详解
在前面几个章节章节中,详细的讲解了Koltin中的接口类(Interface).枚举类(Enmu),还不甚了解的可以查看我的上一篇文章Kotlin--接口类.枚举类详解.当然,在Koltin中,除了接 ...
随机推荐
- 1-1docker加速器
配置加速器 #编译配置 sudo vim /etc/docker/daemon.json #加入下面的数据 { "registry-mirrors": ["https:/ ...
- Spring boot启动成功后输出提示
添加logback-spring.xml,将log输出到文件,控制台输出的level改为error因此只会出处banner src/main/resources/banner.txt的内容为 star ...
- 解决net core mvc 中文乱码问题
在Startup 配置文件下的ConfigureServices方法中添加: services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All ...
- ActiveMQ 安装方法
1. 打开浏览器,访问网址 http://activemq.apache.org/components/classic/download/ ,下载最新的版本,当前最新版本为5.15.9,根据Activ ...
- SQL Server 特殊字符及中文汉字的处理
简介 在SQL Server 中很多时候需要对一些字段中特殊的字符做处理,比如某个字段中包含一些回车.制表.换行等特殊字符(这些字符往往来源于Excel).这些特殊字符的存在可能导致无法提取到所需数据 ...
- 【转帖】HBase简介(梳理知识)
HBase简介(梳理知识) https://www.cnblogs.com/muhongxin/p/9471445.html 一. 简介 hbase是bigtable的开源山寨版本.是建立的hdf ...
- 【题解】Luogu P5340 [TJOI2019]大中锋的游乐场
原题传送门 没想到省选也会出这种题??! 实际就是一个带有限制的最短路 因为\(k<=10\),所以我们珂以暴力将每个点的权值分为[-k,k],为了方便我们珂以转化成[0,2k],将汉堡的权值记 ...
- Spring Boot Freemarker特别篇之contextPath【从零开始学Spring Boot
需求缘起:有人在群里@我:请教群主大神一个问题,spring boot + freemarker 怎么获取contextPath 头疼死我了,网上没一个靠谱的 .我就看看之前博客中的 [Spri ...
- AspNetCore MVC页面数据提交验证
2019/05/14,AspNetCore 2.2.0 摘要:AspNetCore MVC使用数据注释配合jquery.validate提交页面进行前端加后端的数据验证 主要用到了jquery.val ...
- angular复习笔记2-架构总览
angular架构总览 一个完整的Angular应用主要由6个重要部分构成,分别是:组件.模板.指令.服务.依赖注入和路由.这些组成部分各司其职,而又紧密协作,它们的关系如图所示. 与用户直接交互的是 ...