第一行代码 第三版 第8章 8.5 kotlin 课堂 :泛型和委托

8.5 kotlin 课堂 :泛型和委托

8.5.1 泛型的基本用法

泛型 : 允许我们在不指定具体类型的情况下进行编程,可以是我们的代码拥有更好的拓展性。

泛型 主要有两种定义方式: 定义泛型类 定义泛型方法; 语法结构是****

class MyClass <T>{
	fun method(param :T): T {
		return param
	}
}

调用时就可以将泛型指定成具体的类型

val myClass =MyClass<Int> ()
val result = myClass.method(123)

只定义一个泛型方法

class MyClass {
	fun <T> method(param :T): T {
		return param
	}
}

调用时 也会发生一点改变。

val myClass =MyClass ()
val result = myClass.method(123)

Kotlin 允许我们对泛型的类型进行限制
Number 表示:将泛型上界 设置为Number 类型;表明我们只能将method方法的泛型指定成数字类型

class MyClass {
	fun <T :Number> method(param :T): T {
		return param
	}
}

默认情况下,所有泛型都是可以指定成可空类型的,这是因为在不动手指定上界的时候,泛型的默认上界是Any?;
如果想让泛型的类型不可为空,只需将上界指定成Any ;

8.5.2 类委托和委托属性

委托是一种设计模式 :基本理念 :操作对象自己不会去处理某段逻辑,而是把工作委托给另外一个辅助对象去处理。

类委托 将一个类的具体实现委托给另一个类去完成。

借助于委托模式:我们可以轻松实现一个自己的实现类。
如:定义一个MySet,并让他实现Set接口:

class MySet<T> (val helprSet:HashSet<T>) :Set<T>{
    override val size: Int
        get() = helprSet.size

    override fun contains(element: T) = helprSet.contains(element)
    override fun containsAll(elements: Collection<T>)= helprSet.containsAll(elements)
    override fun isEmpty()=helprSet.isEmpty()
    override fun iterator()=helprSet.iterator()
}

这其中接收的一个HashSet参数,这就相当于一个辅助对象;然后在Set接口中的所有的方法的实现中,我们都没有进行自己的实现,而是调用了辅助对象中的相应的方法实现。这就是一种委托模式。
好处:我们可以只实现大部分方法,少部分的方法可以有自己来重写,甚至加入一些自己独有的方法。
为了避免调用对象中的待实现方法过多的情况:kotlin提供了解决方法;

kotlin中委托使用的关键字是 by

class MySet<T>(val helperSet:HashSet<T>):Set<T> by helperSet{
}

该段代码功能与上面的代码相同。
如果想对某个方法进行重新实现,可以单独重写那个方法;

委托属性 将一个属性(字段)的具体实现委托给另外一个类去完成

委托属性的语法结构:

class MyClass{
	var p by Delegate()
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值