介面 (Interface)
介面用來定義一組未實作的公共屬性與行為,不管具體如何實作。
定義介面
使用 interface
關鍵字來定義介面
interface MyInterface {
fun foo()
fun bar(){
//optional body
}
}
實作介面
每一個類別皆可以實作一個或多個介面
class Child : MyInterface{
override fun foo(){
//body
}
}
- 在類別名稱的後方用冒號
:
加上介面名稱,表示實作該介面。 - 若有多個介面需要實作,可以用逗號
,
區隔。 - 若介面的函式未實作,則實作它的類別一定需要覆寫該函式。如 foo()
預設實作
在介面中,可以定義屬性。
若屬性未給予預設值,則表示該屬性為抽象屬性,需要被覆寫
interface MyInterface {
val prop: Int // abstract val propertyWithImplementation: String
get() = "foo" fun foo() {
print(prop)
}
}class Child : MyInterface {
override val prop: Int = 29
}
抽象類別 (abstract class)
抽象類別兼具介面和一般類別的某些特性。抽象類別允許只定義而不實作屬性或函數,這很像介面;抽象類別也能夠定義建構函數,還能夠充當超類別,這很像一般類別。
關鍵字 abstract
加在 class 前方,該類別即成為抽象類別。
abstract class Human constructor(
val height:Int,
val weight:Int
) {
abstract fun gender():String
}
繼承抽象類別
與繼承介面相同,使用冒號 :
即可繼承抽象類別。唯一不同的是,抽象類別名稱後需要加上 ()
,若有建構子參數則必須填入。
如下例:
class TallMan: Human(180, 70) {
fun gender():String = "Man"
}
如果在繼承抽象類別,卻沒有將抽象函數全部繼承,則該類別也成為抽象類別,需在類別定義前加上 abstract
abstract class TallMan: Human(180, 70) {}
介面 VS 抽象類別
介面與抽象類別同樣都是被設計用來擴充類別的物件。
不同在於:
- 一個類別可以實作多個介面,但是只能實作一個抽象類別。
- 抽象類別含有建構函數,介面則沒有。
- 介面與抽象類別皆不需要
open
關鍵字,因為這兩個物件都是設計來給其他類別繼承的。