Kotlin之介面

  • 2019 年 10 月 5 日
  • 筆記

昨天寫協成之後感覺協成的文章不是太好些要慢慢屢屢,因此今天折回來聊聊介面……

為啥會有介面呢?這個還要從繼承說起,OOP的世界中繼承這個東東太複雜了而目前C++依然保留這多繼承的體系其餘的大部分新興的高級語言都捨棄了多繼承,但是僅僅單繼承又不符合OOP的概念體系,怎麼辦!!!於是介面應運而生—繞過多繼承的坑,有能有多繼承帶來的好處……這些都是今天引入介面的引子,我們下面看看Kotlin介面帶來哪些新的不同

1 介面中可以定義方法及方法體和屬性

interface MyInterface{      //子類需要實現      fun sayHello()      //可以被子類覆寫      fun hi(){          println("hi,gay")      }      //可以被覆寫      val name:String  }    abstract class B:MyInterface{      override val name: String          get() = "B Name"  }

上栗中我們看到介面中可以定義屬性變數和方法甚至可以直接實現方法體,這在Java中是不被允許的,當然了這個在swift中是第一的創新,也再次驗證了Kotlin是另一版本的swift?

2介面繼承

interface  MySubInterface:MyInterface{      override fun sayHello() {          TODO("not implemented") //To change body of created functions use File | Settings | File Templates.          println("sub interface --sayHello")      }      override val name: String          get() {              return  "MySubInterface"          }  }    class AA: MySubInterface{}

不錯吧,Kotlin的介面繼承還是很有意思的,可以完全吧class應有的功能全部搞定

3繼承時的衝突問題

文章以開頭我們就說了Kotlin可以實現多介面繼承,那麼當出現多介面中方法名重複如何處理呢?我們先看一個例子

interface C{      fun foo(){          println("C--->foo")      }      fun bar()  }  interface D{      fun foo(){          println("D---->foo")      }      fun bar(){          print("D---->bar")      }  }

例子中CD幾口均實現里自己定義的方法foo,而bar介面只有在D中實現,C中的bar介面等待子類去實例化。例子設計的很全面既有重名的方法還有重名單有沒有實現的方法

  class E: C,D{      override fun foo() {          super<C>.foo()          super<D>.foo()      }        override fun bar() {          super.bar()      }  }

自理中對於foo的覆寫我們補多少,而要想覆寫時調用父類的方法foo則需要要指定調用哪個父類的foo方法從而區分出不同的類繼承。而對於bar我們發現我們省略了聲明父類的聲明—因為C並沒有實現bar的方法體也就無所謂調用父類的功能啦,當然了為了程式碼規範一致性我們還是可以把父類的聲明給添加上super<D>.bar()