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中,除了接 ...
随机推荐
- 搭建ELK日志分析平台
(上)—— ELK介绍及搭建 Elasticsearch 分布式集群 http://blog.51cto.com/zero01/2079879 (下)—— 搭建kibana和logstash服务器 h ...
- tcp端口扫描与syn扫描
连接网络设备时,一般都会在网络设备端选取0-65535之间的一个端口进行连接,端口扫描是指:检查网络设备上0-65535号端口哪些端口是开启状态.如果黑客扫描到某网络设备的80端口是开启状态,那么很有 ...
- WINGIDE 激活失败
WINGIDE 7.1 激活失败 WINGIDE 7.0 激活成功 1 下载 https://www.7down.com/soft/94270.html 2 安装 3 激活 step 1: st ...
- python入门和杂识
1需要理解的一些概念 1.C语言编译完就是机器码,机器码可以直接在处理器上执行. 2.CPU可以直接读取机器码. 3.Python是用C写的. 4.Python解释器会把代码内容读到内存里,通过Pyt ...
- 晶体管放大电路与Multisim仿真学习笔记
前言 开始写点博客记录学习的点滴,第一篇就写基本的共射极放大电路吧. 很多教材都是偏重理论,而铃木雅臣著作的<晶体管电路设计>是一本很实用的书籍,个人十分推荐! 下面开始我的模电重温之旅吧 ...
- TomatoLog 是一个基于 .NETCore 平台的产品。
TomatoLog TomatoLog 是一个基于 .NETCore 平台的产品. The TomatoLog 是一个中间件,包含客户端.服务端,非常容易使用和部署. 客户端实现了ILoggerFac ...
- kubernetes常用命令:缩容扩容回滚
查看版本 kubectl version 查看节点 kubectl get nodes 部署app 说明: 提供deployment名称和app镜像地址(docker镜像地址) kubectl run ...
- List集合分批多线程处理,同时控制最大并发
业务中,要实现数据日终同步,采用将同步文件中的数据封装成List集合分批处理加多线程的方式,根据数据量动态设置线程数,同时控制最大并发数量(业务中有IO操作,避免过大并发导致堵塞),实现效率提高 // ...
- Centos7 yum方式安装MySQL
1.下载安装源 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2.yum方式安装 yu ...
- 虚拟机出现“The system is running in low-graphics mode”的解决方法
我用虚拟机安装了ubuntu的版本后,又在上面安装了几个插件,第二次打开虚拟机就出现下面的提示: 通过在网上查找教程,找到了以下的解决方法 1.Ctrl+Alt+F1进入控制台 2.输入用户密码 3. ...