上篇介紹了基本的 class
的用法,這篇將會進階的介紹到 class
之間的關係
繼承父 class 的 function
在物件導向上面,能夠去強化物件之間的關係。透過繼承能夠確認出,每個 class
的父子關係,為何會談到父子關係呢?主要程式上的概念是希望把 class
需要共用的部分額外提出來,不要重複去寫這些 function,子的部分就是再去各自改寫就好。
以下面的 code 為例,今天一家銀行最基本的功用就是存錢以及提錢,而各家銀行的存款利率都不同,所以這部分就另外寫,如下:
open class BankAccount(val accountNumber: String, val accountName: String) {
var balance : Double = 0.0
fun depositeMoney(amount: Double): Boolean {
if(amount > 0) {
balance += amount
return true
} else {
return false
}
}
fun withdrawMoney(amount: Double): Boolean {
if(amount > balance) {
return false
} else {
balance -= amount
return true
}
}
}
class SavingsAccount (accountNumber: String, accountName: String, val interestRate: Double) :
BankAccount(accountNumber, accountName) {
fun depositInterest() {
val interest = balance * interestRate / 100
this.depositeMoney(interest);
}
}
將這樣的 class
關係先訂定好,其他家銀行或許有其他的方案,或許有其他要做的 function,但基本的存款提款都不會變。 SavingsAccount
繼承了 BankAccount
,並且另外實作了一個 depositInterest
function,應用如下:
fun main(args: Array<String>) {
// Create a Savings Account with 6% interest rate
val savingsAccount = SavingsAccount("64524627", "Rajeev Kumar Singh", 6.0)
savingsAccount.depositeMoney(1000.0)
savingsAccount.depositInterest()
println("Current Balance = ${savingsAccount.balance}")
}
這樣 savingsAccount
既可以使用屬於自己的 function depositInterest
,也可以使用到他的"父親"的 function。
Overriding
意思就是說去名稱是造著父的 function,但是內容卻重新改寫, code ,如下,MathsTeacher
改寫了他父親的 teach
:
open class Teacher {
// Must use "open" modifier to allow child classes to override it
open fun teach() {
println("Teaching...")
}
}
class MathsTeacher : Teacher() {
// Must use "override" modifier to override a base class function
override fun teach() {
println("Teaching Maths...")
}
}
在 main 裡面就能夠這樣的使用:
fun main(args: Array<String>) {
val teacher = Teacher()
val mathsTeacher = MathsTeacher()
teacher.teach() // Teaching...
mathsTeacher.teach() // Teaching Maths..
}