2023-12-08|閱讀時間 ‧ 約 5 分鐘

【Kotlin 入門指南】繼承 (Inheritance)

【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q

繼承

繼承是物件導向程式設計中一個重要的概念,它允許你建立一個新的類別,這個類別可以繼承另一個已存在的類別的特性和行為。在 Kotlin 程式語言中,繼承可以幫助你建立出更具結構化和可維護性的程式碼。

繼承基本用法範例

在 Kotlin 程式語言中,使用 : 符號來表示一個類別繼承自另一個類別。語法如下:

// 定義父類別(基礎類別)
open class 父類別名稱 {
// 屬性與函數
}

// 定義子類別(衍生類別),並繼承父類別
class 子類別名稱 : 父類別名稱() {
// 子類別特有的屬性與函數
}

在這個範例中,子類別名稱 會繼承 父類別名稱 的屬性與函數。使用 open 關鍵字來聲明父類別,表示這個類別可以被繼承。預設一般類別 class 都是關閉的,需特別在 class 前方加入 open 關鍵修飾詞,才能讓其他類別繼承。而類別中的屬性與方法也是,需特別在前方加入 open 關鍵字,才能讓繼承的子類別覆寫。否成編譯會報錯誤。

方法覆寫範例

子類別可以覆寫父類別中的函數,以提供自己的實現邏輯。在父類別的函數前加上 open,並在子類別中使用 override 來重新實現該函數。

//父類別
open class SuperClass{
open val myName = "HKT"
open fun myFun() {
println("MyPClass")
}
}

//子類別
class SubClass() : SuperClass() {
override val myName = "Hello"
override fun myFun() {
println("SubClass")
}
}

fun main() {
println(SubClass().myName)//Hello
SubClass().myFun()//SubClass
}

在這個範例中,SuperClass 是一個開放的類別,可以被其他類別繼承。它包含了一個名為 myName 的屬性以及一個名為 myFun() 的函數,並且這兩者皆使用了 open 關鍵字。這表示其他子類別可以覆寫(override)這個類別的屬性和函數,修改其功能或特性。

接著定義SubClass 繼承 SuperClass 的子類別,並且我們在這裡覆寫了 myName 屬性和 myFun() 函數。在 SubClass 中,myName 的值被改寫為 "Hello",而 myFun() 函數印出 "SubClass"

main() 函數中,我們創建了 SubClass 的實例,並分別使用 println(SubClass().myName)SubClass().myFun() 來印出屬性 myName 的值和執行 myFun() 函數。

protected 範例

若想要保護特定的屬性或方法,可以在它們前面加上「protected」關鍵字,這樣僅限繼承的子類別才能存取到這些內容。

//父類別
open class SuperClass{
protected open val myName = "HKT"
protected open fun myFun() {
println("MyPClass")
}
}

//子類別
class SubClass() : SuperClass() {
public override val myName = "Hello"
public override fun myFun() {
println("SubClass")
}
}

fun main() {
println(SuperClass().myName)//錯誤
SuperClass().myFun()//錯誤
}

在這範例中,在 main() 函數中,我們創建了 SubClass 的實例,並分別使用 println(SubClass().myName)SubClass().myFun() 來嘗試存取印出屬性 myName 的值和執行 myFun() 函數,但因為在SuperClass 中被 protected 起來,所以直接呼叫會發生不錯誤。

當屬性或函數被標記為 protected 時,它們僅能在宣告它們的類別或其子類別中使用,而無法在其他地方直接存取。所以 SubClass中,可以覆寫 SuperClass 的屬性與函數,因為他是子類別他繼承了 SuperClass

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.