【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」關鍵字,這樣僅限繼承的子類別才能存取到這些內容。
//父類別
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
。