Chào mừng độc giả đến với Cafedev, nơi chúng tôi chia sẻ kiến thức và đam mê về lập trình. Hôm nay, chúng tôi muốn giới thiệu về mô hình Delegation trong Kotlin. Cafedev tin rằng, trong lập trình, sự đổi mới là chìa khóa và Delegation là một giải pháp xuất sắc thay thế cho kế thừa cài đặt. Với Kotlin, bạn có thể triển khai mô hình này mà không cần bất kỳ mã boilerplate nào, tối ưu hóa sự linh hoạt và sáng tạo trong quá trình phát triển. Hãy cùng khám phá sức mạnh của Kotlin with Delegation!”

Mô hình Delegation pattern đã chứng minh là một sự thay thế tốt cho kế thừa cài đặt, và Kotlin hỗ trợ nó một cách tự nhiên mà không cần bất kỳ mã boilerplate nào.
Một lớp Derived có thể triển khai một giao diện Base bằng cách giao phó tất cả các thành viên công cộng của nó cho một đối tượng cụ thể:

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

fun main() {
    val b = BaseImpl(10)
    Derived(b).print()
}

Đoạn mã by trong đoạn code với class Derived chỉ ra rằng b sẽ được lưu trữ nội tại trong các đối tượng của Derived và trình biên dịch sẽ tạo tất cả các phương thức của Base chuyển tiếp đến b.

1. Ghi đè thành viên của một giao diện được triển khai bằng cách delegation

Overrides hoạt động như bạn mong đợi: trình biên dịch sẽ sử dụng các triển khai override của bạn thay vì những cái trong đối tượng delegation. Nếu bạn muốn thêm override fun printMessage() { print("abc") } vào Derived, chương trình sẽ in ra abc thay vì 10 khi printMessage được gọi:

interface Base {
    fun printMessage()
    fun printMessageLine()
}

class BaseImpl(val x: Int) : Base {
    override fun printMessage() { print(x) }
    override fun printMessageLine() { println(x) }
}

class Derived(b: Base) : Base by b {
    override fun printMessage() { print("abc") }
}

fun main() {
    val b = BaseImpl(10)
    Derived(b).printMessage()
    Derived(b).printMessageLine()
}

Tuy nhiên, lưu ý rằng các thành viên bị ghi đè theo cách này không được gọi từ các thành viên của đối tượng delegation, mà chỉ có thể truy cập các triển khai của nó của các thành viên giao diện:

interface Base {
    val message: String
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override val message = "BaseImpl: x = $x"
    override fun print() { println(message) }
}

class Derived(b: Base) : Base by b {
    // This property is not accessed from b's implementation of `print`
    override val message = "Message of Derived"
}

fun main() {
    val b = BaseImpl(10)
    val derived = Derived(b)
    derived.print()
    println(derived.message)
}

Tìm hiểu thêm về delegated properties.

Chân thành cảm ơn bạn đã đọc bài viết về Kotlin with Delegation trên Cafedev. Chúng tôi hy vọng rằng thông tin và kiến thức mà chúng tôi chia sẻ đã giúp bạn hiểu rõ hơn về mô hình delegated trong ngôn ngữ lập trình Kotlin. Nếu bạn có bất kỳ câu hỏi hoặc ý kiến nào, hãy chia sẻ ngay trên Cafedev. Chúng tôi luôn sẵn lòng đón nhận đóng góp từ cộng đồng để xây dựng một nguồn thông tin đáng tin cậy và hữu ích cho cộng đồng lập trình viên. Hãy tiếp tục theo dõi Cafedev để cập nhật những thông tin mới nhất và bài viết chất lượng.”

Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây

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!