Kotlin的了解与学习-----接口与实现

接口

接口的关键字和java一样,也是interface

[java] view plain copy
  1. interface MyListener {  
  2.     fun onSuccess(msg: String)  
  3.   
  4.     fun onError(msg: String = "失败", code: Int)  
  5. }  
  6.   
  7. class MyLClass : MyListener{  
  8.     override fun onSuccess(msg: String) {  
  9.   
  10.     }  
  11.   
  12.     override fun onError(msg: String, code: Int) {  
  13.   
  14.     }  
  15. }  


如上,可以看到,在kotlin中,实现和继承一样,都是用的:这个符号,你可能疑问,如果同时存在继承和实现呢
[java] view plain copy
  1. class MyLClass : MyListener, Person() {  
  2.     override fun faFoo(): String {  
  3.         return ""  
  4.     }  
  5.   
  6.     override fun onSuccess(msg: String) {  
  7.   
  8.     }  
  9.   
  10.     override fun onError(msg: String, code: Int) {  
  11.   
  12.     }  
  13. }  


是的,用逗号分隔开就可以了,不分前后,系统会自动区分接口还是继承

你可能想到了,如果我想继承一个接口,而不是实现一个接口呢,很明显,类是不能继承接口的,能继承的接口的只有接口,而同时,接口是不能继承一个非接口的类,只能继承接口,并且不能实现另一个接口。所以很明显,extends和implement这两个关键字是不需要存在的。

另外代码里,我还放了一个小彩蛋,这个是在以前提到过的默认值

[java] view plain copy
  1. fun onError(msg: String = "失败", code: Int)  

那我们在调用这个方法时,就可以这样了
[java] view plain copy
  1. mListener.onError(0)  
  2. //相当于  
  3. mListener.onError("失败",0)  

可能你们尝试过在类中建立一个参数,并不赋值
[java] view plain copy
  1. var a : Int  


却发现,不允许这样做,这就是kotlin的空指针安全了,那么,什么时候允许呢,就是接口里。

在接口中,可以定义一个抽象的属性,像上面那种,同时,如果有类实现了该接口,就必须对该抽象属性进行赋值

[java] view plain copy
  1. override var a: Int = 10  

这个大家需要自己去尝试一下了。


多实现的冲突处理

假如类同时实现了两个不同的接口,并且两个接口存在一个相同名称的方法,如下:

[java] view plain copy
  1. interface MyListener1 {  
  2.     fun onSuccess(msg: String)  
  3.   
  4.     fun onError(msg: String = "失败", code: Int)  
  5. }  
  6.   
  7. interface MyListener2 {  
  8.     fun onSuccess(msg: String)  
  9.   
  10.     fun onProgress(progress: Int)  
  11. }  
  12.   
  13. class MyLClass : MyListener1, MyListener2 {  
  14.     override fun onProgress(progress: Int) {  
  15.           
  16.     }  
  17.   
  18.     override fun onSuccess(msg: String) {  
  19.   
  20.     }  
  21.   
  22.     override fun onError(msg: String, code: Int) {  
  23.   
  24.     }  
  25. }  


可以看到MyLClass这个类,只实现了三个方法,那么这个onSuccess到底代表了哪一个呢?我们可以使用super<接口名>的方式,定位到对应的接口方法中去
[java] view plain copy
  1. super<MyListener2>.onSuccess(""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值