【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(二)

简介: 【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(二)

VI . 接口中的属性属性覆盖 ( 变量 / 常量 )


接口中的属性覆盖 :



① 抽象属性 : 接口中的 变量 / 常量 属性可以声明成抽象的 ;


② 关于访问器 : 只有常量才能使用添加访问器替代抽象属性方案 , 变量不能添加访问器 ;


③ 常量与变量 : 覆盖属性 , 可以使用变量覆盖常量 , 反过来不行 , 变量只能使用变量覆盖 ;


//1 . 接口定义
interface Intf{
    //抽象属性 常量 , 默认被 abstract open 修饰 ( 可省略 )
    //常量可以提供一个访问器 , 变量只能声明成抽象属性 , 不能添加访问器
    val age : Int
    //抽象属性 变量 , 默认被 abstract open 修饰 ( 可省略 )
    //常量可以提供一个访问器 , 变量只能声明成抽象属性 , 不能添加访问器
    var name : String
}
//2 . 接口实现类
abstract class Impl : Intf {
    //覆盖属性 , 可以使用变量覆盖常量 , 反过来不行
    override var age: Int = 18
    //覆盖属性 , 变量只能使用变量覆盖
    override var name: String = "Tom"
}



VII . 接口覆盖冲突问题


1 . 接口覆盖冲突问题描述 : 一个类可以实现多个接口 , 如果多个接口中出现相同函数签名的函数 ( 正常带方法体的函数 ) , 如何调用不同接口的相同签名函数 ; ( 注意 : 这里调用的方法是有方法体的正常方法 )



2 . 覆盖冲突解决方案 : 可以通过 super<接口名> 调用不同接口的正常方法 ;



3 . 代码示例 : Intf1 和 Intf2 接口中都定义了非抽象函数 action_real , Impl 类实现了两个接口 , 通过使用 super.action_real() 调用 Intf1 中的 action_real 方法 , 通过使用 super.action_real() 调用 Intf2 中的 action_real 方法


/

/接口 1 定义
interface Intf1{
    fun action_abstract()
    fun action_real(){
        println("Intf1 : action_real")
    }
}
//接口 2 定义
interface Intf2{
    fun action_abstract()
    fun action_real(){
        println("Intf2 : action_real")
    }
}
//实现两个接口
class Impl : Intf1 , Intf2 {
    override fun action_abstract() {
        println("Impl : action_abstract")
    }
    override fun action_real() {
        //调用 Intf1 接口中的 action_real 方法
        super<Intf1>.action_real()
        //调用 Intf2 接口中的 action_real 方法
        super<Intf2>.action_real()
    }
}




VIII . 接口继承接口


接口继承接口 :



① 派生接口继承 : 一个接口可以继承另一个接口 , 派生接口拥有基类接口的成员 ;


② 派生接口新成员 : 派生接口声明新的接口成员和属性 ;


③ 子类实现派生接口 : 需要实现两个接口的所有的抽象成员 ( 属性 / 方法 ) ;


//接口定义
interface Intf1{
    //抽象属性
    var age : Int
    //抽象方法
    fun action_abstract()
}
//接口定义
interface Intf2 : Intf1{
    //抽象属性
    var name : String
    //抽象方法
    fun action_abstract2()
}
//接口实现 , 注意没有构造函数委托
//需要实现 Intf1 和 Intf2 中的抽象成员
class Impl : Intf2 {
    override var name: String = "Tom"
    override var age: Int = 18
    override fun action_abstract() {
        println("Impl : action_abstract")
    }
    override fun action_abstract2() {
        println("Impl : action_abstract")
    }
}


目录
相关文章
|
1月前
|
Java Kotlin
Kotlin教程笔记(12) - 面向对象之继承与实现
Kotlin教程笔记(12) - 面向对象之继承与实现
|
1月前
|
Java 物联网 Kotlin
Kotlin - 面向对象之抽象类与接口
Kotlin - 面向对象之抽象类与接口
|
20天前
|
Java Kotlin
Kotlin教程笔记(12) - 面向对象之继承与实现
Kotlin教程笔记(12) - 面向对象之继承与实现
26 4
|
20天前
|
Java 物联网 Kotlin
Kotlin教程笔记(11) - 面向对象之抽象类与接口
Kotlin教程笔记(11) - 面向对象之抽象类与接口
23 2
|
20天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
|
1月前
|
NoSQL Redis Kotlin
Kotlin - 属性代理
Kotlin - 属性代理
27 5
|
1月前
|
NoSQL Redis Kotlin
Kotlin - 属性代理
Kotlin - 属性代理
25 1
|
1月前
|
Java Kotlin
Kotlin - 面向对象之继承与实现
Kotlin - 面向对象之继承与实现
30 4
|
1月前
|
Java Kotlin
Kotlin教程笔记(12) - 面向对象之继承与实现
Kotlin教程笔记(12) - 面向对象之继承与实现
72 9
|
1月前
|
Java 物联网 Kotlin
Kotlin教程笔记(11) - 面向对象之抽象类与接口
Kotlin教程笔记(11) - 面向对象之抽象类与接口
64 9