织梦采集侠官方网站济南 网站 建设
news/
2025/9/23 13:41:27/
文章来源:
织梦采集侠官方网站,济南 网站 建设,网站建设文化案例,网站建设是怎么挣钱的1.委托模式
委托模式#xff1a;操作对象不会去处理某段逻辑#xff0c;而是会把工作委托给另外一个辅助对象去处理。 例如我们要设计一个自定义类的来实现Set#xff0c;可以将该实现委托给另一个对象#xff1a;
class MySetT (val helperSet: HashSetT操作对象不会去处理某段逻辑而是会把工作委托给另外一个辅助对象去处理。 例如我们要设计一个自定义类的来实现Set可以将该实现委托给另一个对象
class MySetT (val helperSet: HashSetT) : SetT {override val size: Intget() helperSet.sizeoverride fun isEmpty(): Boolean {return helperSet.isEmpty()}override fun iterator(): IteratorT {return helperSet.iterator()}override fun containsAll(elements: CollectionT) 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 MySetT(val helperSet: HashSetT) : SetT by helperSet {override fun contains(element: T) false //自己重写该方法来定制功能fun eat() println(I can eat.) //新增方法
}类委托本质简化实现委托模式所需要写的很多不必要代码
3.类可以委托给对象的情况
可以的情况 a.构造函数中传入
class MyList2(theList: ArrayListString) : ListString by theList {
}b.object的属性
class MyList3 : ListString by theList {object theList : ArrayListString()
}c.伴生对象中的属性
class MyList4 : ListString by theList {companion object {val theList: ListString ArrayListString()}
}d.直接创建对象
class MyList6 : ListString by ArrayList() {
}e.调用函数获得对象
fun getDdd() : LinkedListString {return LinkedListString()
} class MyList7 : ListString by getDdd() {
}不可以的情况 a.字段
class MyList : ListString by theList { //编译报错提示Unresolved reference: theListval theList: ListString ArrayListString()
}b.构造函数中的变量
class MyList8 : ListString by theList { //编译报错提示Unresolved reference: theListinit {val theList ArrayListString()}
}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()方法因为它是常量 参考文章 类声明的右边也能写 byKotlin 的接口委托是这么用的
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912718.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!