属性委托总结回顾:

在前三次已经将Kotlin委托相关的知识点进行了完整的学习了,具体博文如下:

下面再整体完整的将其进行一下回顾,来巩固所学的知识。

关于属性委托的要求:

对于只读属性来说(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方法,那么该方法就会被调用来创建属性委托实例,下面用具体代码来瞅一下它的使用。

需要定义几个组件,如下:

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

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

然后再调用一下:

接下来则改一下:

再运行:

因为不满足委托条件,所以利用提供委托就能达到过滤委托的作用,实际中用这种特性用得不多,但是得了解它是个什么东东。

最新文章

  1. 关于WEB Service&amp;WCF&amp;WebApi实现身份验证之WCF篇(1)
  2. Vue2.0流式渲染中文乱码问题
  3. Shell编程—定时任务
  4. .Net程序员玩转Android系列之三~快速上手(转)
  5. 【C语言学习】-01 C基础
  6. hdu_5878_I Count Two Three(预处理)
  7. linq 在查询表达式中处理异常
  8. ZOJ 1403&amp;&amp;HDU 1015 Safecracker【暴力】
  9. vue,vuex的后台管理项目架子structure-admin,后端服务nodejs
  10. 【设计模式】原型模式 Pototype Pattern
  11. [LeetCode] Reaching Points 到达指定点
  12. pycharm导入自己写的.py文件时,模块下方出现红色波浪线解决
  13. IdentityServer4【QuickStart】之切换到混合流并且添加API访问
  14. 在eclipse中从cvs下载项目,再部署到tomcat常见错误!
  15. 学习Acegi应用到实际项目中(2)
  16. 【xsy1300】 原题的旅行 最短路+倍增
  17. hdu 2870 Largest Submatrix(平面直方图的最大面积 变形)
  18. 初识restful api接口
  19. HTTP 无法注册URL 进程不具有命名空间的访问权限
  20. 去掉JAVA部分依赖的事例

热门文章

  1. 【idea】全局搜索、替换只显示100条的问题
  2. [转帖]CNN、RNN、DNN的一般解释
  3. asp net core Remote Validation 无法验证
  4. hdu 1427 速算24点【暴力枚举】
  5. go标准库I/O模型:epoll+多协程
  6. 记一次奇怪的python多个变量拼接后的字符串丢失事件
  7. 《JAVA高并发编程详解》-类的加载过程简介
  8. .Net Core WepApi-JWT认证
  9. docker容器入门最佳教程
  10. 没有15k薪资都不会了解的测试内幕