解析Kotlin中的委托(包括类委托,属性委托)【笔记摘要】

1.委托模式

委托模式:操作对象不会去处理某段逻辑,而是会把工作委托给另外一个辅助对象去处理。
例如我们要设计一个自定义类的来实现Set,可以将该实现委托给另一个对象:

class MySet<T> (val helperSet: HashSet<T>) : Set<T> {override val size: Intget() = helperSet.sizeoverride fun isEmpty(): Boolean {return helperSet.isEmpty()}override fun iterator(): Iterator<T> {return helperSet.iterator()}override fun containsAll(elements: Collection<T>) = helperSet.containsAll(elements)override fun contains(element: T) = helperSet.contains(element)override fun contains(element: T) = false  //自己重写该方法来定制功能fun eat() = println("I can eat.")  //新增方法
}

这样就可以让大部分的方法实现调用辅助对象中的方法,少部分的方法实现由自己来重写,甚至加入一些自己独有的方法,那么MySet就会成为一个全新的数据结构类

2.类委托

如上委托模式的代码实现存在一个弊端,如果接口中待实现的方法特别多,那么相应每个都去调用辅助对象中的相应方法实现将会特别复杂
这时候在Kotlin中使用by关键字,再接上受委托的辅助对象,就可以免去之前所写的一大堆模板式的代码了:

class MySet<T>(val helperSet: HashSet<T>) : Set<T> by helperSet {override fun contains(element: T) = false  //自己重写该方法来定制功能fun eat() = println("I can eat.")  //新增方法
}

类委托本质:简化实现委托模式所需要写的很多不必要代码

3.类可以委托给对象的情况

可以的情况:

 a.构造函数中传入
class MyList2(theList: ArrayList<String>) : List<String> by theList {
}
 b.object的属性
class MyList3 : List<String> by theList {object theList : ArrayList<String>()
}
 c.伴生对象中的属性
class MyList4 : List<String> by theList {companion object {val theList: List<String> = ArrayList<String>()}
}
 d.直接创建对象
class MyList6 : List<String> by ArrayList() {
}
 e.调用函数获得对象
fun getDdd() : LinkedList<String> {return LinkedList<String>()
}    class MyList7 : List<String> by getDdd() {
}


不可以的情况:

 a.字段
class MyList : List<String> by theList {  //编译报错,提示:Unresolved reference: theListval theList: List<String> = ArrayList<String>()
}
 b.构造函数中的变量
class MyList8 : List<String> by theList {   //编译报错,提示:Unresolved reference: theListinit {val theList = ArrayList<String>()}
}

4.属性委托

属性委托的核心思想是将一个属性(字段)的具体实现委托给另一个对象去完成
可以看到,这里使用by关键字连接了左边的p属性和右边的Delegate类去完成。当调用p属性的时候会自动调用Delegate的getValue()方法,当给p属性赋值的时候会自动调用Delegate类的setValue()方法

class MyClass {var p by Delegate()
}

Delegate的具体实现:在Delegate类中我们必须实现getValue()和setValue()这两个方法,并且都要使用operator关键字进行声明

class Delegate {var proValue: Any? = null//第一个参数用于声明该Delegate类的委托功能可以在什么类中使用//第二个参数是Kotlin中的一个属性操作类,可用于扩区各种属性相关的值,在当前场景用不着,但必须在方法参数上进行声明//返回值可以声明成【任何类型】,根据具体的实现逻辑去写就可以了operator fun getValue(myClass: MyClass, prop: KProperty<*>) : Any? {return proValue}//前两个参数和getValue()相同//最后一个参数表示具体要赋值给委托属性的值,这个参数类型必须要和getValue()方法返回值的类型保持一致operator fun setValue(myClass: MyClass, prop: KProperty<*>, value: Any?) {proValue = value}
}

现在当我们给p属性赋值时,就会调用Delegate的setValue()方法;当获取p属性的值时,就会调用Delegate类的getValue()方法
如果p属性是使用val关键字声明的,那么就不用在Delegate类中实现setValue()方法,因为它是常量


参考文章:
类声明的右边也能写 by?Kotlin 的接口委托是这么用的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不懂PyQt5垂直布局?只需3分钟即可学会

PyQt5中实现垂直布局&#xff0c;主要使用QVBoxLayout类。该布局管理器将子控件垂直排列&#xff0c;并可以根据需要自动调整大小。使用QVBoxLayout可以方便地构建从上到下排列的界面元素。 import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPus…

Vue.js 中属性绑定的详细解析:冒号 `:` 和非冒号的区别

Vue.js 中属性绑定的详细解析&#xff1a;冒号 : 和非冒号的区别 在 Vue.js 中&#xff0c;属性绑定是一个重要的概念&#xff0c;它决定了如何将数据绑定到 DOM 元素的属性上。Vue.js 提供了两种方式来绑定属性&#xff1a;使用冒号 : 进行动态绑定&#xff0c;或直接书写属性…

一个scrapy的pipeline,用于将item使用json序列化后推到kafka

使用Python的kafka-python库来与Kafka进行通信 安装kafka-python库&#xff1a; pip install kafka-python编写pipeline import json from kafka import KafkaProducerclass KafkaPipeline:def open_spider(self, spider):self.producer KafkaProducer(bootstrap_servers[l…

一个例子理解傅里叶变换的计算过程

假设我们有一个简单的信号&#xff0c;由两个不同频率的正弦波组成&#xff0c;我们希望通过傅里叶变换来分析其频谱。 示例信号 假设我们有一个信号 &#xff1a; 这个信号由两个频率成分组成&#xff1a;一个50 Hz的正弦波和一个120 Hz的正弦波&#xff0c;后者的振幅是前者…

ubuntu nautilus 无法输入中文

通过 /etc/environment 设置环境变量 /etc/environment GTK_IM_MODULEfcitx QT_IM_MODULEfcitx XMODIFIERSimfcitx

昇思MindSpore学习入门-静态图像加速

使用静态图加速 背景介绍 AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介绍如下&#xff1a; 动态图模式 动态图的特点是计算图的构建和计…

catia数控加工仿真铣平面粗加工

1&#xff0c;零件建模&#xff0c;毛坯建模 2 在毛坯上建立坐标系 3 添加资料刀具 4&#xff0c;双击对相关加工信息做设置 5 Roughing 加工设置 高亮红色区域是必选的&#xff0c;其他可以默认 6 完成加工仿真 7 加工余量

基于自然语言处理的智能客服系统构建:中文AI的实践智慧

基于自然语言处理的智能客服系统构建&#xff1a;中文AI的实践智慧 随着人工智能技术的飞速发展&#xff0c;智能客服系统已成为众多企业提升服务质量和效率的关键工具。在中文环境下构建这样一个系统&#xff0c;不仅要求技术方案能够精准理解中文的复杂性&#xff0c;还要能…

Upload-Labs靶场闯关

文章目录 Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16Pass-17Pass-18Pass-19Pass-20 以下是文件上传绕过的各种思路&#xff0c;不过是鄙人做题记下来的一些思路笔记罢了。 GitHub靶场环境下载&#x…

mindspore打卡之量子概念和测量

mindspore打卡之量子概念和测量 mindspore打卡之量子测量 我们可以看到&#xff0c;采样1000中&#xff0c;00出现了503次&#xff0c;11出现了497次&#xff08;由于测量具有随机性&#xff0c;每次运行结果会略有不同&#xff09;&#xff0c;采样结果符合概率分布&#xff0…

如果只能选一款老挝语翻译工具,那么只保留《老挝语翻译通》App!一款支持老挝文OCR识别提取文字的翻译神器!

准备去探索老挝这个国家&#xff0c;语言不同怎么办&#xff1f;推荐使用《老挝语翻译通》App&#xff0c;一款专为老挝语学习者和旅行者设计的翻译和学习工具&#xff0c;让你轻松掌握老挝语&#xff0c;无需打字对着说话就能翻译的老挝语翻译通&#xff0c;一定能得到你的认可…

基于C#在WPF中使用斑马打印机进行打印

最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来。苦苦折腾了两天&#xff0c;总算有所收获&#xff0c;就发到网上来骗骗分数-_-|| 项目中使用的打印机型号为GX430t的打印机&#xff0c;接手的时候&#xff0c;自己对于打印机这块儿是眼前…

C实现RPC远程调用(代码待验证)

C语言实现RPC远程调用 在不借助如ONC RPC、gRPC等专门RPC库的情况下&#xff0c;实现C语言的RPC远程调用将是一个相当复杂的任务&#xff0c;因为RPC通常涉及到网络通信、数据序列化/反序列化、远程过程调用机制等多个方面。然而&#xff0c;为了提供一个概念性的示例&#xf…

STM32第八课:Su-03t语音识别模块

文章目录 需求一、SU03T语音识别模块二、模块配置流程1.固件烧录2.配置串口和传输引脚3.中断函数4.double类型转换5 数据发送6.接收处理 三、该模块完整代码总结 需求 基于上次完成空气质量传感器&#xff0c;利用SU03T语音识别模块&#xff0c;实现空气质量的语音问答播报。 …

云端守护:在iCloud中管理设备安全更新的全面指南

&#x1f6e1;️ 云端守护&#xff1a;在iCloud中管理设备安全更新的全面指南 iCloud不仅是一个数据同步和备份的云服务&#xff0c;它还是确保你的Apple设备安全的重要工具。通过iCloud&#xff0c;你可以轻松管理设备的安全更新&#xff0c;确保它们始终运行最新、最安全的软…

(3)深入探索Python:条件语句、循环结构与函数定义的全面解析

目录 1. 前言2. 条件语句2.1 if 语句2.2 if else 语句2.3 if elif else 语句 3. 循环结构3.1for循环3.2 while循环 4. 函数定义5. 总结 1. 前言 在Python编程中&#xff0c;条件语句、循环结构和函数定义是构建程序逻辑的核心要素。它们不仅决定了程序的执行流程&#xff0c;还…

从零开始:如何设计一个现代化聊天系统

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/chat-system 在当今数字化时代,聊天系统已成为我们日常生活和工作中不可或缺的一部分。从个人交流到团队协作,从客户服务到社交网络,聊天应用…

HY Lisp 读取宏(reader macro)学习

在学习HY lisp语言的时候HY编程快速入门实践课第三章 HY宏入门-CSDN博客&#xff0c;学习到了读取宏&#xff08;reader macro&#xff09;&#xff0c;尝试将其概念弄明白。 首先&#xff0c;读取宏是Lisp语言中都有的一种概念&#xff0c;所以可以通过任意一种Lisp语言的文档…

免费可视化工具如何提升智慧物流管理效率

在现代智慧物流中&#xff0c;免费可视化工具正扮演着越来越重要的角色。这些工具通过数据的可视化展示&#xff0c;使物流管理更加高效、透明和智能化。免费可视化工具可以将复杂的物流数据转换为直观的图表和图形&#xff0c;帮助管理者实时监控和分析物流运作情况&#xff0…

Fork函数在操作系统中的作用与实现机制

Fork函数在操作系统中的作用与实现机制 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. Fork函数概述 在Unix/Linux操作系统中&#xff0c;fork函数是一个…