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") } }