【4】Kotlin基础——接口的多种使用

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方,欢迎各位在评论中指出。

一、接口

Kotlin语言和Java语言都是单继承结构,即一个类最多只能继承一个父类,但是却可以实现任意多个接口。(注意这里的"最多"代表0个或1个)

1.1 接口的声明与实现

我们先来了解一下如何用Kotlin语言声明一个接口。在下面的示例代码中我们声明了一个Study接口和两个方法,它们分别是readBooks()和doHomework()。

interface Study {
    fun readBooks()
    fun doHomework()
}

接下来我们尝试让Student类继承Person类并实现Study接口,需要注意的是这里的Student类代码与之前的内容并不相同。

                                     继承父类             实现接口
class Student(name: String, age: Int): Person(name, age), Study {
    override fun readBooks() {
        println(name + "is reading.")
    }
    override fun doHomework() {
        println(name + "is doing homework.")
    }
}

在上面的代码中,Student作为子类继承自Person父类,并且实现了Study接口。在Java语言中继承的关键字是extends,而实现接口的关键字是implements。而在Kotlin语言中,类的继承和接口的实现都用冒号:表示,多个接口的实现则用逗号进行分隔
例如A类继承了B类并实现了C接口:

class A : B(), C {  
    // ...  
}

再例如A类继承了B类并实现了C接口和D接口:

class A : B(), C, D {  
    // ...  
}

某个类一旦实现了一个接口,就需要对该接口中的方法进行实现。在Kotlin语言中使用override关键字重写父类或者实现接口中的方法。

1.2 面向接口编程(多态)

以下代码用于演示接口的多态性:

fun main(){
    val student = Student("Mike", 18)
    //因为Student类实现了Study接口 所以Student类的对象也可以作为参数传递给doStudy()方法
    doStudy(student)
}

//doStudy()方法要求接收一个Study类型参数
fun doStudy(study: Study){
    study.readBooks()
    study.doHomework()
}

//运行结果
——> Mike is reading.
——> Mike is doing homework.

其实Student的实例可以直接调用readBooks()和doHomework()的,不过为了演示多态而故意写复杂了一些。

fun main(){
    val student = Student("Mike", 18)
    student.readBooks()
    student.doHomework()
}

//运行结果
——> Mike is reading.
——> Mike is doing homework.

1.3 接口的默认实现函数

Kotlin为了让接口的使用更加灵活,额外增加一个功能:允许对接口中定义的函数进行默认实现。在下面的代码中我们给Study接口中的doHomework()方法增加了一个方法体,它的功能是打印一句话。如果接口中的一个方法拥有了方法体,那么这个方法体中的内容就是这个方法的默认实现。

interface Study {
    fun readBooks()
    
    //默认实现
    fun doHomework() {
        println("do homework default implementation.")
    }
}

当一个类去实现Study接口时,只会强制要求其实现readBooks()方法,而对doHomework()方法则没有要求,你可以选择实现或者不实现该方法。之所以会这样,是因为我们在Study接口中已经为doHomework()方法添加了方法体。当在实现接口的时候,如果你不实现doHomework()方法,则会使用该方法默认的实现逻辑。反之,如果你重新实现了该方法,则不会使用该方法默认的实现逻辑。

1.4 Kotlin语言中的修饰符

Kotlin语言的修饰符和Java还是存在些许差异,下面是它们的区别:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Kotlin实现RecyclerView的多种item布局,需要创建多个ViewHolder来适配不同的布局类型。具体步骤如下: ```kotlin // 创建一个通用的ViewHolder类 class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { // 绑定数据的方法 fun bindData(data: Any) { // 根据不同的数据类型,绑定不同的布局 when (data) { is TypeA -> { // 绑定TypeA布局 } is TypeB -> { // 绑定TypeB布局 } // ... } } } // 创建一个通用的Adapter类 class BaseAdapter(private val dataList: List<Any>) : RecyclerView.Adapter<BaseViewHolder>() { // 根据不同的布局类型,创建不同的ViewHolder override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { return when (viewType) { TYPE_A -> { // 创建TypeA布局的ViewHolder } TYPE_B -> { // 创建TypeB布局的ViewHolder } // ... else -> { // 创建默认布局的ViewHolder } } } // 根据不同的数据类型,返回不同的布局类型 override fun getItemViewType(position: Int): Int { return when (dataList[position]) { is TypeA -> TYPE_A is TypeB -> TYPE_B // ... else -> DEFAULT_TYPE } } // 绑定数据到ViewHolder override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { holder.bindData(dataList[position]) } // 返回数据列表的大小 override fun getItemCount(): Int { return dataList.size } companion object { // 定义不同的布局类型 private const val TYPE_A = 0 private const val TYPE_B = 1 // ... private const val DEFAULT_TYPE = -1 } } ``` 在上述代码中,我们创建了一个通用的ViewHolder类和一个通用的Adapter类。ViewHolder类中的bindData方法根据不同的数据类型,绑定不同的布局。Adapter类中的getItemViewType方法根据不同的数据类型,返回不同的布局类型。在onCreateViewHolder方法中,根据不同的布局类型,创建不同的ViewHolder。在onBindViewHolder方法中,将数据绑定到ViewHolder上。最后,在RecyclerView中设置Adapter即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值