iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
1

本篇文章大概會討論到下列幾個主題

  • 如何定義 interface ?

  • 如何實現 interface ?

  • interface 的 多個 implete

  • interface 的 多型機制

如何定義 interface ?

interface 的用途 在於 他可以把共同行為 抽象化 讓需要實作的對象 再去實作他
這樣子好處 , 讓我們可以實現多型 , 這個 類別的復用性變高 , 不再拘泥於單一繼承關係
可以 依實際需求實做出我需要的內容

interface 的 成員如果是抽象並不會有 { } ,並不需要加上 abstract keyword , 我們需要在實現他時把他實例化。


interface DialogView {

fun showDialog ()

}

interface 的 成員如果並不是抽象 會有 方法體 { }


interface DialogView {

fun showDialog (){

println("The Dialog is showed")

}

}

interface 跟一般 class 不同 他並沒有建構式 , 所以他只能將屬性加在 { } 內


interface DialogView {

 val timeInterval:Double 
 

}

interface 和 abstract class 不同的 地方在於 他並無法儲存狀態 , 因此他並無法去初始化屬性
但我們可以自訂 getter 設定讀(get)這個變數時 ,所會讀到數值。


interface DialogView {

 val timeInterval:Double 
 get () = 20.0
 

}

interface 中宣告的屬性沒有幕後欄位,所以在訪問器中不能引用field 。


interface DialogView {

 var timeInterval:Double 

  set(value) {
  
    field = value  
 } 
 
 // 由於不能在 interface 中使用 field 如果像上面這樣寫會編譯錯誤 
 
  get () = 20.0
 // Error
 //Property in an interface cannot have a backing field

}

如果在 setter ()中,不引用field欄位 ,就不會導致 編譯錯誤


interface DialogView {

 var timeInterval:Double 
 set(value) {
     print("We cant't set the field , sorry")
     
 }    
 get () = 20.0
 

}


當然實現這個 Interface 的所有類別都可以複寫這個屬性


class AlarmDialog: DialogView {

override val timeInterval

get () = 50.0
 

如何實現 interface ?

下面例子實例化了 DialogView ,要實作Interface 只要 在冒號後面 interface 的名稱
由於 interface 並沒有建構式 類別名稱後並不需要加上 ()

覆寫的方式和 繼承是一樣的

我們需要實作它的抽象成員

下面實作了DialogView 的抽象方法 showDialog ()


class AlarmDialogView () : DialogView {

override fun showDialog (){

// 實作 我們要 Alarm 的 內容

}


}


如果選擇不實作抽象成員,可以把這個類別宣告成 抽象 丟給 子類實作 , 這個用法在某些情形特別有用


 

abstract class AlarmDialogView () : DialogView {

 

}



 

 class LoginAlarmDialogView () :AlarmDialogView {

 
override fun showDialog (){

// 實作 我們要 Alarm 的 內容

}

 

}


interface 的 多個 implete

與繼承 不同 一個 class 只可以繼承 一個 class 但可以實現 多個 interface


interface DialogView {

fun showDialog ()

}


interface ToastView {

fun toast ()

}

有一個 View 同時有 Toast 和 showDialog 的 功能 , 依照我們的需求我們可實作
兩個 interface


class MainView : ToastView, DialogView{

override fun showDialog () {


}

override fun toast () {



}
}

interface 的 多型機制

一個類別只能有一個繼承一個 abstract , 但是能實作數個 interface
介面不但有 抽象的好處 , 使用它也不需拘泥於單一繼承關係 大大增加了彈性
介面 就像是一個功能(技能), 可以遊走不同類型,並不需要向類別繼承一樣那麼
嚴謹, 而類別繼承,就表明了這個類別的類型, 像人是一個類型 , 車子是一個類型
一個類別的型態不可能同時是 人 又是車子 (人車合體 XDD), 但是我們可以從人
和車的共同行為中 達成協定 比方説跑 車子會跑 人也會跑 就定義出 interface
包含跑的 功能 , 讓車子和人 這兩個類別分別定義出各自不同跑的行為


interface Skill {

fun run ()


}


class Person : Skill {

overrid fun run (){

// 實作 person run 的 技能

}

}


class Car : Skill {

overrid fun run (){


// 實作 car run 的 技能

}

}



上一篇
[Day 14 ] Kotlin 空(null)安全檢查
下一篇
[Day 16] Kotlin Lambdas 表達式
系列文
Android 菜鳥村-開發基礎 30篇32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言