Trong bài viết này, bạn sẽ được giới thiệu về lập trình hướng đối tượng trong Kotlin. Bạn sẽ tìm hiểu về khái niệm một class là gì, cách tạo các đối tượng và sử dụng nó trong chương trình.

Kotlin hỗ trợ cả lập trình hướng đối tượng và lập trình hàm.

Kotlin hỗ trợ các tính năng như các hàm thứ bậc cao, các loại hàm và lambdas, điều này khiến Kotlin trở thành một lựa chọn tuyệt vời để làm việc theo phong cách lập trình hàm. Bạn sẽ tìm hiểu về các khái niệm này trong các chương sau. Bài viết này sẽ tập trung vào phong cách lập trình hướng đối tượng trong Kotlin.

1. Lập trình hướng đối tượng (OOP)

Nếu bạn quên hay chưa rõ về OPP, bạn có thể tham kho OPP trong C++ này, khá chi tiết.

Trong phong cách lập trình hướng đối tượng, bạn có thể phân chia một vấn đề phức tạp thành các tập hợp nhỏ hơn bằng cách tạo ra các đối tượng.

Những đối tượng này có chung hai đặc điểm về:

  • Trạng thái
  • Hành vi

Hãy lấy một vài ví dụ:

  1. Đèn là một đối tượng
  1. Nó có thể ở trạng thái  bật hoặc là tắt.
  2. Bạn có thể bật và tắt đèn (hành vi).
  3. Xe đạp là một đối tượng
  1. Nó có các trạng thái như số hiện tại, hai bánh, hộp số,….
  2. Nó có các hành vi: phanh, tăng tốc, đổi số,….

Bạn sẽ tìm hiểu về các tính năng chi tiết của một chương trình hướng đối tượng như: đóng gói dữ liệu , tính kế thừa và đa hình. Bài viết này sẽ tập trung vào những điều cơ bản để giữ cho mọi thứ đơn giản.

Tài liệu nên đọc: Đối tượng là gì?




2. Class trong Kotlin

Trước khi bạn tạo các đối tượng trong Kotlin, bạn cần xác định một class.

Một class có thể được coi là một bản thiết kế chi tiết cho đối tượng.

Chúng ta có thể nghĩ về class như một bản phác thảo (nguyên mẫu) của một ngôi nhà. Nó chứa tất cả các chi tiết về sàn nhà, cửa ra vào, cửa sổ,… Dựa trên những mô tả này, chúng ta có thể xây dựng được một ngôi nhà. Ở đây ngôi nhà là đối tượng.

Vì có thể tạo được  nhiều ngôi nhà từ cùng một lời mô tả, tương tự nhue vậy, chúng ta có thể tạo nhiều đối tượng từ một class.

2.1. Làm thế nào để xác định một class trong Kotlin?

Để xác định một class trong Kotlin, từ khóa class được sử dụng:

class ClassName {
    // property
    // member function
    ... .. ...
}

Dưới đây là một ví dụ:

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }
}

Ở đây, chúng ta đã định nghĩa một class có tên là Lamp.

class có một thuộc tính isOn (được định nghĩa giống như cách định nghĩa biến), và hai hàm thành viên là hàm turnOn()và hàm turnOff().

Tài liệu nên đọc: hàm Kotlin

Trong ngôn ngữ lập trình Kotlin, thuộc tính phải được khởi tạo hoặc phải được khai báo là abstract (Truy cập: class absstract trong Kotlin để tìm hiểu thêm). Trong ví dụ trên, thuộc tính isOn được khởi tạo một giá trị là false.




Các class, đối tượng, thuộc tính, hàm thành viên,… có thể có các khả năng hiển thị khác nhau. Ví dụ: thuộc tính isOn là private. Điều này có nghĩa là, thuộc tính isOn chỉ có thể được thay đổi từ bên trong class Lamp.

Các chế độ hiển thị khác là:

  • private – chỉ có thể nhìn thấy (có thể được truy cập) từ bên trong class.
  • public – có thể nhìn thấy ở mọi nơi
  • protected – hiển thị cho class và subclass của nó.
  • internal – bất kỳ khách hàng nào trong mô-đun có thể truy cập chúng.

Nếu bạn không chỉ định mức độ hiển thị, nó sẽ được mặc định là public.

Trong chương trình trên, các hàm thành viên turnOn()và turnOff() là public trong khi, thuộc tính isOn là private.

2.2. Các đối tượng trong Kotlin

Khi class được định nghĩa thì chỉ có đặc điểm của đối tượng được xác định; ngoài ra, không có bộ nhớ hoặc vùng lưu trữ nào được phân bổ.

Để truy cập các thành viên được xác định trong class, bạn cần tạo các đối tượng. Hãy tạo các đối tượng của class Đèn.

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }
}

fun main(args: Array<String>) {

    val l1 = Lamp() // create l1 object of Lamp class
    val l2 = Lamp() // create l2 object of Lamp class
}

Chương trình này tạo ra hai đối tượng l1 và l2  của class Đèn. Thuộc tính isOn cho cả hai Lamp l1 và l2 là false.

2.3. Làm thế nào để truy cập hàm thành viên?

Bạn có thể truy cập các thuộc tính và các hàm thành viên của một class bằng cách sử dụng ký hiệu ‘.’. Ví dụ,

l1.turnOn()

Câu lệnh này gọi hàm turnOn() cho đối tượng l1.

Hãy lấy một ví dụ khác:




l2.isOn = true

Ở đây, chúng ta đã gán true cho Thuộc tính isOn của đối tượng l2. Lưu ý rằng, Thuộc tính isOn là private, và nếu bạn cố gắng truy cập isOn từ bên ngoài class, một ngoại lệ sẽ được ném ra.

Ví dụ: class và đối tượng trong Kotlin

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }

    fun displayLightStatus(lamp: String) {
        if (isOn == true)
            println("$lamp lamp is on.")
        else
            println("$lamp lamp is off.")
    }
}

fun main(args: Array<String>) {

    val l1 = Lamp() // create l1 object of Lamp class
    val l2 = Lamp() // create l2 object of Lamp class

    l1.turnOn()
    l2.turnOff()

    l1.displayLightStatus("l1")
    l2.displayLightStatus("l2")
}

Khi bạn chạy chương trình, kết quả sẽ là:

l1 Lamp is on.
l2 Lamp is off.

Trong chương trình trên,

  • class Lamp được tạo ra.
  • class có một thuộc tính isOn và ba hàm thành viên là turnOn(), turnOff()và displayLightStatus().
  • Hai đối tượng l1 và l2 của class Lamp được tạo ra trong hàm main().
  • Ở đây, hàm turnOn() được gọi bằng cách sử dụng đối tượng l1: l1.turnOn(). Hàm này cho biến instance isOn của đối tượng l1 nhận giá trị true.
  • Và, hàm turnOff() được gọi bằng cách sử dụng đối tượng l2: l1.turnOff(). Hàm này cho biến instance isOff của đối tượng l2 nhận giá trị false.
  • Sau đó, hàm displayLightStatus() được gọi cho đối tượng  l1 và l2 để in thông điệp phù hợp, tùy thuộc vào việc thuộc tính isOn là true hay false.

Lưu ý rằng, thuộc tính isOn được khởi tạo là false bên trong class. Khi một đối tượng của class được tạo, thuộc tính isOn của đối tượng đó sẽ tự động được khởi tạo là false. Vì vậy, đối tượng l2 khôn cần phải gọi hàm turnOff()để chỉ định giá trị của thuộc tính isOn là false.

Ví dụ:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }

    fun displayLightStatus() {
        if (isOn == true)
            println("lamp is on.")
        else
            println("lamp is off.")
    }
}

fun main(args: Array<String>) {

    val lamp = Lamp()
    lamp.displayLightStatus()
}

Khi bạn chạy chương trình, kết quả sẽ là:

lamp is off.

Bài viết này chỉ là một phần giới thiệu về lập trình hướng đối tượng trong Kotlin. Hãy xem các chương này theo trình tự để tìm hiểu thêm:

  • Constructors và Initializers trong Kotlin
  • Từ khóa this trong Kotlin 
  • Class lồng nhau trong Kotlin