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
下面例子實例化了 DialogView ,要實作Interface 只要 在冒號後面 interface 的名稱
由於 interface 並沒有建構式 類別名稱後並不需要加上 ()
覆寫的方式和 繼承是一樣的
我們需要實作它的抽象成員
下面實作了DialogView 的抽象方法 showDialog ()
class AlarmDialogView () : DialogView {
override fun showDialog (){
// 實作 我們要 Alarm 的 內容
}
}
如果選擇不實作抽象成員,可以把這個類別宣告成 抽象 丟給 子類實作 , 這個用法在某些情形特別有用
abstract class AlarmDialogView () : DialogView {
}
class LoginAlarmDialogView () :AlarmDialogView {
override fun showDialog (){
// 實作 我們要 Alarm 的 內容
}
}
與繼承 不同 一個 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 () {
}
}
一個類別只能有一個繼承一個 abstract , 但是能實作數個 interface
介面不但有 抽象的好處 , 使用它也不需拘泥於單一繼承關係 大大增加了彈性
介面 就像是一個功能(技能), 可以遊走不同類型,並不需要向類別繼承一樣那麼
嚴謹, 而類別繼承,就表明了這個類別的類型, 像人是一個類型 , 車子是一個類型
一個類別的型態不可能同時是 人 又是車子 (人車合體 XDD), 但是我們可以從人
和車的共同行為中 達成協定 比方説跑 車子會跑 人也會跑 就定義出 interface
包含跑的 功能 , 讓車子和人 這兩個類別分別定義出各自不同跑的行為
interface Skill {
fun run ()
}
class Person : Skill {
overrid fun run (){
// 實作 person run 的 技能
}
}
class Car : Skill {
overrid fun run (){
// 實作 car run 的 技能
}
}