Trong bài viết này, cafedev chia sẻ cho bạn về class trừu tượng và cách triển khai nó trong ngôn ngữ lập trình Kotlin (với sự trợ giúp của các ví dụ).

Giống như Java, ta sử dụng từ khóa abstract để khai báo các class trừu tượng trong Kotlin. Một class trừu tượng không thể được khởi tạo (chúng ta không thể tạo các đối tượng của một class trừu tượng). Tuy nhiên, chúng ta có thể kế thừa các subclass từ chúng.

Các thành viên (thuộc tính và hàm) của một class trừu tượng đều là không trừu tượng trừ khi chúng ta sử dụng từ khóa abstract một cách rõ ràng để làm cho chúng trừu tượng. Hãy lấy một ví dụ:

(Đoạn code)

Ở đây,

  • một class trừu tượng tên là Person đã được tạo ra. Bạn không thể tạo các đối tượng của class này.
  • class có một thuộc tính không trừu tượng là age và một hàm không trừu tượng là displaySSN(). Nếu bạn cần ghi đè các thành viên này trong subclass, chúng nên được đánh dấu bằng từ khóa open.
  • class có một hàm trừu tượng là displayJob(). Chúng ta không thể triển khai nó và nó phải được ghi đè trong các subclass của nó.

Lưu ý: Các class trừu tượng luôn mở. Bạn không cần phải sử dụng từ khóa open một cách rõ ràng để kế thừa các subclass từ chúng.

1. Ví dụ: hàm và class trừu 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/
*/

abstract class Person(name: String) {

    init {
        println("My name is $name.")
    }

    fun displaySSN(ssn: Int) {
        println("My SSN is $ssn.")
    }

    abstract fun displayJob(description: String)
}

class Teacher(name: String): Person(name) {

    override fun displayJob(description: String) {
        println(description)
    }
}

fun main(args: Array<String>) {
    val jack = Teacher("David Xuan")
    jack.displayJob("I'm a mathematics teacher.")
    jack.displaySSN(23123)
}

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

My name is David Xuan.
I'm a mathematics teacher.
My SSN is 23123.

Ở đây, một class Teacher được dẫn xuất từ class trừu tượng Person.

Một đối tượng jack của class Teacher được khởi tạo. Chúng ta đã truyền”Jack Smith” như một tham số tới hàm tạo chính trong khi tạo nó. Điều này thực hiện khối khởi tạo của class Person.

Sau đó, hàm displayJob() được gọi bằng cách sử dụng đối tượng jack. Lưu ý rằng hàm displayJob() này được khai báo là trừu tượng trong class cơ sở và được ghi đè trong class dẫn xuất.

Cuối cùng, hàm displaySSN() được gọi bằng cách sử đối tượng jack. Hàm này là không trừu tượng và được khai báo trong class Person (chứ không được khai báo trong class Teacher).

Các Interface trong Kotlin tương tự như các class trừu tượng. Tuy nhiên, interface không thể lưu trữ trạng thái trong khi các class trừu tượng thì có thể.

Điều này có nghĩa là, interface có thể có thuộc tính nhưng nó cần phải trừu tượng hoặc phải triển khai accessor. Trong khi đó, một thuộc tính của một class trừu tượng thì lại không nhất thiết phải là trừu tượng.

Full series tự học Kotlin từ cơ bản tới nâng cao.

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!