繼承 覆寫 轉型
Prerequisites:
open
Kotlin預設是不能被繼承,若要讓類別可以被繼承,在class前面加上open。
在fun前面加上open,才能被子類別覆寫。
在變數前面加上open,才能被子類別覆寫。
1
2
3
4
open class Parent { // 使用open class
open var name: String = "" // 使用open 變數
open fun showData() {} // 使用open fun
}
override
子類別 : 父類別()來繼承父類別。
覆寫父類別的方法,前面要加上override。
1
2
3
4
open class Parent { // 使用open class
open var name: String = "Parent" // 使用open 變數
open fun showData() {} // 使用open fun
}
1
2
3
4
5
6
7
8
9
class Child : Parent() {
override var name: String = "Child"
set(value) {
field = value.trim()
}
override fun showData() { // 使用override fun
println("name = $name")
}
}
1
2
3
4
5
6
fun main() {
var child: Child = Child()
child.showData()
child.name = " Alex "
child.showData()
}
name = Child
name = Alex
多型
多型就是類型是父類別,實際上指向子類別,執行時也是子類別。
1
2
3
4
5
6
fun main() {
var obj: Parent = Child()
obj.showData()
obj.name = " Alex "
obj.showData()
}
name = Child
name = Alex
轉型as
在子類別增加一個方法showInfo,這個方法只有子類別才有。
1
2
3
4
5
6
7
8
9
10
11
12
13
class Child : Parent() {
override var name: String = "Child"
set(value) {
field = value.trim()
}
override fun showData() { // 使用override fun
println("name = $name")
}
fun showInfo() {
println("這是子類別才有的方法")
}
}
在多型的狀況下,類型是父類別,根本找不到showInfo()的方法。
1
2
3
4
5
6
7
fun main() {
var obj: Parent = Child()
obj.showData()
//以下無法執行
obj.showInfo()
}
需要將類型是父類別,轉型成類型是子類別。
1
2
3
4
5
6
7
fun main() {
var obj: Parent = Child()
obj.showData()
//以下可以執行了
(obj as Child).showInfo()
}
name = Child
這是子類別才有的方法
不可能每一次呼叫showInfo()都要轉型,kotlin支援只要執行過一次as,obj不用再轉型。
1
2
3
4
5
6
7
8
9
fun main() {
var obj: Parent = Child()
obj.showData()
//以下可以執行了
(obj as Child).showInfo()
obj.showInfo()
obj.showInfo()
}
name = Child
這是子類別才有的方法
這是子類別才有的方法