Trong bài viết này, cafedev chia sẻ cho bạn học cách làm việc với các class con và class lồng nhau với sự trợ giúp của các ví dụ.

1. Class lồng nhau trong Kotlin

Tương tự như Java, Kotlin cho phép bạn định nghĩa một class trong một class khác được gọi là class lồng nhau.

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

Từ class Nested là một thành viên của class Outer bên ngoài nó, bạn có thể sử dụng ký hiệu . để truy cập class Nested và các thành viên của nó.

2. Ví dụ: Class lồng nhau trong 

/*
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 Outer {

    val a = "Outside Nested class."

    class Nested {
        val b = "Inside Nested class."
        fun callMe() = "Function call from inside Nested class."
    }
}

fun main(args: Array<String>) {
    // accessing member of Nested class
    println(Outer.Nested().b)

    // creating object of Nested class
    val nested = Outer.Nested()
    println(nested.callMe())
}

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

Inside Nested class.
Function call from inside Nested class.

Đối với người dùng Java

Class lồng nhau trong Kotlin tương tự như static class lồng nhau trong Java.

Trong Java, khi bạn khai báo một class trong một class khác, nó sẽ trở thành một class con theo mặc định. Tuy nhiên trong Kotlin, bạn cần sử dụng công cụ sửa đổi inner để tạo một class con, điều này chúng ta sẽ thảo luận sau.

3. Class con trong Kotlin

Các class lồng nhau trong Kotlin không có quyền truy cập vào instance của class ngoài. Ví dụ,

class Outer {
    val foo = "Outside Nested class."

    class Nested {
        // Error! cannot access member of outer class.
        fun callMe() = foo
    }
}

fun main(args: Array<String>) {

    val outer = Outer()
    println(outer.Nested().callMe())
}

Đoạn code trên sẽ không được biên dịch vì chúng ta đã cố gắng truy cập thuộc tính foo của class Outer từ bên trong class Nested.

Để giải quyết vấn đề này, bạn cần đánh dấu class lồng nhau bằng inner để tạo một class con. Các class con mang một tham chiếu đến một class bên ngoài và từ đó có thể truy cập các thành viên của class bên ngoài.

4. Ví dụ: Class con 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 Outer {

    val a = "Outside Nested class."

    inner class Inner {
        fun callMe() = a
    }
}

fun main(args: Array<String>) {

    val outer = Outer()
    println("Using outer object: ${outer.Inner().callMe()}")

    val inner = Outer().Inner()
    println("Using inner object: ${inner.callMe()}")
}

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

Using outer object: Outside Nested class.
Using inner object: Outside Nested class.

Bài đọc được đề xuất: Class con ẩn danh

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!