12/08/2018, 15:49

Kotlin for android: Introduce about interface

Interface trong Kotlin về cơ bản kế thừa những gì mà interface của java mang lại, tuy nhiên, nó có những bổ sung mới để trở nên mạnh mẽ hơn. Sự thay đổi lớn nhất là, trong Kotlin, interface có thể thực thi code, chức năng này gần giống với hàm default được mới được giới thiệu trong java 8. Việc ...

Interface trong Kotlin về cơ bản kế thừa những gì mà interface của java mang lại, tuy nhiên, nó có những bổ sung mới để trở nên mạnh mẽ hơn. Sự thay đổi lớn nhất là, trong Kotlin, interface có thể thực thi code, chức năng này gần giống với hàm default được mới được giới thiệu trong java 8.
Việc thay đổi này có giúp chúng ta linh hoạt hơn trong việc sử dụng interface hay không, chúng ta hãy cũng làm rõ nhé.

Interface

Một điều mà chúng ta đều biết đó là interface sinh ra từ một vấn đề đó chính là java không có phép đa thừa kế, nên chúng ta tạo ra interface chỉ được định nghĩa bởi những hành vi, không được implement code, điều này giúp chúng ta có thể implement cùng lúc nhiều interface. Chính điều này đã gây là một chút hạn chế , tuy nhiên trong hầu hết các trường hợp thì nó là ổn, chính java đã nhận ra điều này và nâng cấp nó ở java 8.

Interface in Kotlin

Trong Kotlin, chúng ta có thể thoải mái triển khai các đoạn code ở trong một interface, điều này có nghĩa là chúng ta sẽ có một kiểu interface mạnh mẽ hơn, bao gồm các cả hành vi được định nghĩa và không được định nghĩa.

Việc triển khai code trong interface cũng rất đơn giản

interface Cat {
    fun eat() {
        Log.d("Log cat", "a cat want to eat")
    }
    fun sleep()
}
interface Dog {
    fun drink() {
        Log.d("Log dog", "a dog want to drink")
    }
    fun sleep()
}

bây giờ chúng ta sẽ tạo ra một đối tượng kế thừa từ 2 interfaces trên:

class Pet : Cat, Dog {
    fun dehavior() {
        eat()
        drink()
    }
    
    fun sleep() {
    Log.d("Log cat", "a pet want to sleep")
    }
}

như mọi người thấy, trong một số trường hợp, việc implement code như trên là vô cùng cần thiết.

conflict

oops, vì có thể implement được code trong interface, một rắc rối được nảy sinh là giả sử một đối tượng implement 2 interfaces có cùng chung một method được định nghĩa thì chuyện gì sẽ xảy ra? Kotlin giải quyết vấn đề này rất đơn giản:

interface Cat {
    fun eat() {
        Log.d("Log cat", "a cat want to eat")
    }
}
interface Dog {
      fun eat() {
        Log.d("Log cat", "a cat want to eat")
    }
}
class Pet : Cat, Dog {
    fun eat() {
      super<Cat>.eat()
      super<Dog>.eat()
    }
}

Interface can't keep state

Một điều chúng ta bắt buộc phải nhớ khi làm việc với interface trong Kotlin đó là, mặc dù chúng ta có thể thoải mái implement code, nhưng interface sẽ không giữ trạng thái cho chúng ta, điều này có nghĩa là chúng ta không thể khai báo một biến rồi cấp phát giá trị cho nó, điều này phải thực hiện ở đối tượng implement interface này, phải cách override lại biến đó.

interface Toaster {
val context: Context

fun toast(message: String) {
    Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
class MyActivity : AppCompatActivity(), Toaster {
    override val context = this

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        toast("onCreate")
    }
}

Conclusion

Trên đây mình vừa giới thiệu một số chức năng của interface trong koltin, và tất nhiên, kotlin còn rất rất nhiều thứ thú vị hay ho khác nữa, hy vọng bài viết này sẽ giúp ích cho những người đang tìm hiểu về kotlin như mình, thank you for reading!

0