当前位置: 首页 > wzjs >正文

网站建设平台流程苏州高新区建设局网站管网

网站建设平台流程,苏州高新区建设局网站管网,郑州代理记账,企业的网站设计能否以为导向文章目录 定义继承/实现的委托属性的委托委托给对象委托给另一个变量 自定义可委托类 定义 有时候我们需要办成某件事但又不想自己做时,可以将其交给别人做,这其实就是一种委托。Kotlin 中可以使用by关键字声明委托。 继承/实现的委托 某个类ClassA想…

文章目录

  • 定义
  • 继承/实现的委托
  • 属性的委托
    • 委托给对象
    • 委托给另一个变量
  • 自定义可委托类

定义

有时候我们需要办成某件事但又不想自己做时,可以将其交给别人做,这其实就是一种委托。Kotlin 中可以使用by关键字声明委托。

继承/实现的委托

某个类ClassA想要实现一个接口MyInterface,但是发现接口中的抽象方法非常多,全部实现非常困难。巧的是我们已经有另一个类ClassB(或者该接口的一个对象)实现了该接口,此时我们可以将ClassA的实现MyInterface的工作委托给ClassB

interface MyInterface {// 超多抽象方法fun example()
}class ClassB: MyInterface {// 超多抽象方法的实现override fun example() = print("ClassB 实现")
}class ClassA(classB: ClassB): MyInterface by classB {// ClassA 不需要自己实现 MyInterface 的方法
}fun main() {val classB = ClassB()ClassA(classB).example()
}
ClassB 实现

如果我们发现ClassB中的某个方法的实现并不是ClassA想要的,还可以在ClassA中声明对MyInterface方法的重写,此时如果调用ClassAexample则会调用新重写的这个:

interface MyInterface {// 超多抽象方法fun example()
}class ClassB: MyInterface {// 超多抽象方法的实现override fun example() = print("ClassB 实现")
}class ClassA(classB: ClassB): MyInterface by classB {override fun example() = print("ClassA 实现")
}fun main() {val classB = ClassB()ClassA(classB).example()
}
ClassA 实现

属性的委托

委托给对象

我们可以将属性 getter 和 setter 委托给某一个对象,此时会将getset函数委托给类的getValuesetValue声明。

val修饰的不可变变量只有 getter,因此只会将get委托给getValue

最常见的是Lazy,我们可以使用函数lazy(后边的 lambda 需要返回一个值作为变量的初始值,该值的类型会作为变量类型)生成一个Lazy对象,并将某一个变量委托给它:

val name = "Kotlin".also { println("name 初始化") }
val lazyName by lazy { println("lazyName 初始化"); "Kotlin" }val version = 2.also { println("version 初始化") }
val lazyVersion by lazy { println("lazyVersion 初始化"); 2 }fun main() {// 在运行时,name 就被初始化了// 而委托给 Lazy 的 lazyName 没有被初始化// 在运行时,version 就被初始化了// 只有在访问值时,lazyVersion 才会被初始化lazyVersion
}
name 初始化
version 初始化
lazyVersion 初始化

委托给另一个变量

此时委托变量前需要加双冒号::,事实上,::name会返回一个KMutableProperty0<String>对象,所以这是还是将变量委托给了对象。比较特殊的是,该对象并没有声明getValuesetValue,委托将交给其 getter 和 setter。

二者的 getter 和 setter 实际上已经绑定在一起了,当其中一个的值改变,另一个也会跟着变。

var name: String = "K1"fun main() {var delegateName by ::name// 打印 name 并改变 delegateName 也是同样的结果println(delegateName)name = "K2"print(delegateName)
}
K1
K2

能将可变变量var委托给不可变变量val,因为val没有 setter。

val name: String = "K1"fun main() {// 这是错误的// var delegateName by ::name
}

自定义可委托类

得益于 IDEA 自动补全,我们可以直接写出委托关系var value by MyClass(),鼠标悬停(或者光标置于标红处,按键盘Alt+Enter),点击创建getValuesetValue,并加以修改即可。其中,参数名可以自定义。

生成的nothing(第1个参数)一般是叫thisRef,它的类型是该变量所有者的类型(例如某个类的成员变量,其所有者是该类)。
这里Nothing?则表示没有所有者。对于其他类型,如果加了?,则所有变量都可以委托,如果不加,则只有变量的所有者为指定类型可以委托。

property中则包含了委托变量的属性,例如property.name可以获取到变量名。其类型必须为KProperty<*>

getValue的返回值一般需要指明为所要获取值的类型,这里把MyClass.value返回。
setValue传入的第3个参数则是要赋的值,这里把值给MyClass.value

import kotlin.reflect.KPropertyclass MyClass {private var value = "MyClass"operator fun getValue(thisRef: Nothing?, property: KProperty<*>): String {println("getValue")return value}operator fun setValue(thisRef: Nothing?, property: KProperty<*>, s: String) {println("setValue")value = s}
}fun main() {var value by MyClass()println(value)value = "Hello"print(value)
}
getValue
MyClass
setValue
getValue
Hello
http://www.dtcms.com/wzjs/595012.html

相关文章:

  • 企业网站ui设计莱芜金点子广告电子版2024
  • 网站检测报告哪里做制作网站能挣钱
  • 在家做网站设计打开上次浏览的网站
  • 六安网站建设招商招聘网站是做什麼的
  • 公司在网站做广告怎么做分录测字算命网站开发
  • wordpress需要账号班级优化大师官网登录
  • 网站特效模板下载制作网站的过程细节
  • 微信免费做邀请函模版网站中国建设银行招聘网站报名系统
  • 如何将网站变成免费一个公司可以做几个网站备案
  • 网站建设板块免费下载wordpress google主题
  • 网站建设属于网络还是软件济南本地网站建设公司
  • 做外贸有那些网站平台百度域名注册
  • 赤壁网站建设公司网站建设管理系统
  • 网站建设律师学设计的网站都有哪些
  • dede中英文网站切换商务网站建设论文
  • 为什么网站需要备案医院 网站建设 新闻
  • 网站建设丿找vx cp5173网页界面布局
  • wordpress 主题 her新网站做seo
  • wordpress 企业整站上海最大的企业
  • 网站网页压缩西安网站建设兼职
  • 杭州哪家做网站比较好陇西哪里能学做网站
  • 百度文库 旅游网站建设方案书高端it网站建设
  • html网站开发实例合肥市建设工程市场价格信息网站
  • 北京理工大学网站开发与应用深圳中小企业网站建设
  • 网站开发遇到的最大困难金坛做网站公司
  • 网站负责人拍照重庆平台网站建设哪家有
  • 作业3 主题资源网站建设广东广州番禺区
  • 网站开发 项目式说课贵阳网站开发制作公司
  • 营销网站主题有哪些内容赤峰网站建设建站公司
  • 正式做网站站点怎么新建所有的购物平台大全