kotlin-接口
主要内容
- 接口特性
- 實作
- 屬性
- 重載函數
接口特性
與java 8 中的接口類似,接口允許方法有實作,和抽象類的差別是,接口中的屬性不允許直接初始化,預設是 abstract的。
public interface SomeInterface{
var value:String //預設abstract
fun reading() // 未實作
fun writing(){ //已實作
// do nothing
}
}
接口聲明與類一緻,猜測接口就是特殊的抽象類,接口可以繼承類,java中是不允許接口繼承類的。
open class Box constructor(var value:String){
open var name:String = "jason"
}
interface IBox :Box{
fun beat(){
println("beat $name")
}
}
接口實作
類或對象能實作一個或多個接口,接口也可以繼承接口
interface IBox2 :IBox{
override fun beat(){
println("$name beat IBox2")
}
}
接口定義屬性
允許定義屬性,不允許初始化值,接口不會儲存屬性值,實作接口時,必須重載屬性:
interface MyInterface{
var name:String //name屬性
}
class MyImpl:MyInterface{
override var name: String = "jason" //重載屬性
}
重載函數
與類繼承一緻,當多個接口中存在相同函數時(同名,參數,傳回值),需要分情況對待:
情況一:有一個接口實作了相同函數,子類不用再實作:
interface MyInterface{
fun reading():String
}
interface MyAnotherInterface{
fun reading():String {
return "jason"
};
}
/**不需要顯示的重載接口中reading方法**/
class MyImpl:MyInterface,MyAnotherInterface{
}
情況二:相同函數接口中都未實作,官網文檔中描述: so the compiler does not know which one to choose, and forces us to override foo() and say what we want explicitly .但是實際上,子類重載的函數中并不需要顯示的指明調用接口的函數:
interface MyInterface{
fun reading()
}
interface MyInterface2{
fun reading()
}
class MyImpl:MyInterface,MyInterface2{
override fun reading() {
}
}