Kotlin 學習筆記 (13) — 介面與抽象類別

Andy Lu
3 min readOct 7, 2020

介面 (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 抽象類別

介面與抽象類別同樣都是被設計用來擴充類別的物件。

不同在於:

  1. 一個類別可以實作多個介面,但是只能實作一個抽象類別。
  2. 抽象類別含有建構函數,介面則沒有。
  3. 介面與抽象類別皆不需要 open 關鍵字,因為這兩個物件都是設計來給其他類別繼承的。

如果本篇文章有幫助到您,請 👏🏻鼓勵我。

謝謝 🙇🏻

參考

KotlinLang.org: Interface

KotlinLang.org: Abstract class

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

No responses yet