iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1
Mobile Development

Android 口罩地圖入門實戰 30 天 (使用 Kotlin 程式語言)系列 第 4

Day 4:Kotlin 程式設計基礎入門 (3)

本篇文章同步發表在 HKT 線上教室 部落格,線上影音教學課程已上架至 UdemyYoutube 頻道。另外,想追蹤更多相關技術資訊,歡迎到 臉書粉絲專頁 按讚追蹤喔~

今天要跟大家介紹 Kotlin 語法的內容大綱:

  • 類別
  • 繼承
  • 介面
  • 擴展
  • 泛型

類別

類別的定義

我們會將相關功能放在一個類別當中,就像生活中用的計算機一樣。以這次為例,我們將加、減、乘、除四個數學計算的功能,放在一個計算機類別當中,當別人或是自己下次要使用,不用再重覆造輪子,只要呼叫這個類別,使用裡面的方法即可。

定義一個 Calc 類別

類別裡,加入四個方法,分別是加、減、乘、除。

class Calc {
    fun sum(x: Int, y: Int) {
        println(x + y)//加法運算
    }
    fun substract(x: Int, y: Int) {
        println(x - y)//減法運算
    }
    fun multiply(x: Int, y: Int) {
        println(x * y) //乘法運算
    }
    fun divide(x: Int, y: Int) {
        println(x / y)//除法運算
    }
}

使用類別的方式

我們會將類別實體化出來成為一個物件,透過這個物件來訪問類別裡面定義的屬性與方法。

fun main() {
   //實體化
    val calc = Calc()
    
    calc.sum(1, 1) //2
    calc.substract(1, 1)//0
    calc.multiply(1, 1)//1
    calc.divide(1, 1)//1
}

輸出結果

2
0
1
1

存取類別的屬性

定義一個 Account 類別

在 Account 類別中分別加入帳號、戶名和餘額三個類別屬性

class Account {
    //帳號
    var id: String = ""
    //戶名
    var name: String = ""
    //餘額
    var balance: String = ""
}

存取類別屬性方式

fun main() {
    //實體化
    val account = Account()

    //設定類別屬性值
    account.id = "123456789"
    account.name = "HKT"
    account.balance = "100"

    //獲取類別屬性值
    println(account.id)
    println(account.name)
    println(account.balance)
}

輸出結果

123456789
HKT
100

修改 getter 與 setter 方法

若不想讓使用類別者直接訪問屬性值或是在獲取與設定屬性值過程中想要加工資料,則可以透過 getter 與 setter 方法。

class Account {
    //戶名
    var name: String = ""
        get() = field.toUpperCase()
        set(value) {
            if (value == "") {
                field = "戶名不能為空"
            } else {
                field = value
            }
        }
}
fun main() {
    //實體化
    val account = Account()

    account.name = "HKT"
    println(account.name)

    account.name = ""
    println(account.name)
}

輸出結果

HKT
戶名不能為空

類別初始化

類別被實體化出來時,中間過程會先經過 init 然後 constructor ,可以將想要初始化的邏輯程式放在這裡面。

class Account {
    //戶名
    var name: String = ""

    init {
        println("初始化,第一層")
    }

    constructor() {
        println("初始化,第二層")
    }
}
fun main() {
    //實體化
    val account = Account()

    account.name = "HKT"
    println(account.name)}
}

輸出結果

初始化,第一層
初始化,第二層
HKT

繼承

父類別需加入 open 關鍵修飾詞,才能讓其他子類別繼承,否成編譯會報錯誤。

定義一個父類別 Person

open class Person {
    //戶名
    var name: String = ""
    //地址
    var address: String = ""
}

定義一個子類別 Account 並且去繼承 Person 父類別

class Account : Person() {
    //帳號
    var id: String = ""
}

繼承使用範例

fun main() {
    //實體化
    val account = Account()

    account.id = "123456789"
    account.name = “HKT"
    account.address = "台北市信義區信義路五段7號"

    println(account.id)
    println(account.name)
    println(account.address)
}

輸出結果

123456789
HKT
台北市信義區信義路五段7號

繼承後覆寫屬性

父類別中的屬性,若允許子類別繼承後可以覆寫屬性,須在前方加入 open 關鍵修飾詞,否則編譯時會報錯誤。反過來,若不提供子類別覆寫,則不需要加入open 修飾詞。

open class Person {
    //戶名
    open var name: String = ""
}

在子類別中加入 override 關鍵修飾詞,即可以修飾父類別中的屬性

class Account : Person() {
    //覆寫戶名
    override var name: String = ""
}

繼承後覆寫屬性方式

fun main() {
    //實體化
    val account = Account()

    account.name = "HKT"

    println(account.name)
}

輸出結果

HKT

繼承後覆寫函數

父類別中的方法,若允許子類別繼承後可以覆寫方法,須在前方加入 open 關鍵修飾詞,否則編譯時會報錯誤。反過來,若不提供子類別覆寫,則不需要加入open 修飾詞。

open class Person {
    open fun showName() {
        println("HKT")
    }
}

在子類別中加入 override 關鍵修飾詞,即可以修飾父類別中的方法

class Account : Person() {
    override fun showName() {
        println("Kitty")
    }
}

繼承後覆寫範例

fun main() {
    //實體化
    val account = Account()

    account.showName()
}

輸出結果

Kitty

介面

定義一個的介面

可以透過介面的方式,來約定若要實作這個介面,需履約實作哪些方法。

interface PersonInterface {
    fun showName()
}

實作 Interface 要求的 showName

若我們使用 PersonInterface 介面,但沒履約實作裡面的方法,編譯會噴錯誤。

class Account : PersonInterface {
    override fun showName() {
        println("name: HKT")
    }
}

實際使用介面方式

fun main() {
    //實體化
    val account = Account()

    account.showName()
}

輸出結果

name: HKT

擴展

定義一個 Account 類別

class Account {
    var id: String = ""
}

擴展 Account ,加入新功能

fun Account.Print() {
    println("帳號: " + id)
}

實際使用擴展方式

fun main() {
    //實體化
    val account = Account()
    account.id = "123456789"
    account.Print()
}

輸出結果

帳號: 123456789

泛型

可以把「泛型」想像成是神奇寶貝當中的百變怪。當我們想要處理不論是類別或是方法的參數,想要處理各種傳進來的資料類型,我們就可以使用泛型。

泛型關鍵字: T

class Box<T>(t: T) {
    var value = t
}

泛型使用範例

fun main() {
    val box_int = Box(1)
    println(box_int.value)

    val box_string = Box("我是字串")
    println(box_string.value)
}

輸出結果

1
我是字串

參考資料

HKT 線上教室
https://tw-hkt.blogspot.com/

Freepik
https://www.freepik.com/

Kotlin docs
https://kotlinlang.org/docs/home.html


那今天【iThome 鐵人賽】就介紹到這邊囉~

順帶一提,KT 線上教室,臉書粉絲團,會不定期發佈相關資訊,不想錯過最新資訊,不要忘記來按讚,追蹤喔!也歡迎大家將這篇文章分享給更多人喔。

我們明天再見囉!!!掰掰~


上一篇
Day 3:Kotlin 程式設計基礎入門 (2)
下一篇
Day 5:口罩即時庫存開放資料
系列文
Android 口罩地圖入門實戰 30 天 (使用 Kotlin 程式語言)30

尚未有邦友留言

立即登入留言