Lập trình Kotlin — Interfaces
Trong bài học trước chúng ta đã học về thuộc tính và trường, từ đó chúng ta hiểu về làm sao để khai báo biến hoặc biến không đổi, cũng như hiểu về thuộc tính tính toán,… nếu các bạn chưa xem video thì có thể xem video mình sẽ để link ở trên góc phải. Trong bài học hôm nay chúng ta sẽ học về giao diện.
Interfaces
Interfaces trong lập trình Kotlin có thể có hàm trừu tượng (abstract method) và cũng có hàm đã được hiện thực. Có gì khác biệt giữa interface và lớp trừu tượng? Đó là interfaces không lưu giữ trạng thái và nó cũng có thể có thuộc tính không hoặc đã hiện thực.
Cách tạo interface với Intellij
- File -> New -> Kotlin File / Class
- Click chuột phải vào package bạn muốn tạo interface -> New -> Kotlin File / Class
Màn hình sau sẽ xuất hiện:
Bạn chọn “Interface” và gõ vào tên “FirstInterface”
interface FirstInterface {
fun add()
fun printName() {
println(this::class.java.simpleName)
}
}
Ở đây interface có hai hàm và một thuộc tính. Trong đó chỉ có hàm “printName” đã được hiện thực
Hiện thực interface
Interface có thể hiện thực ở lớp hoặc đối tượng (object). Mỗi lớp / đối tượng có thể hiện thực một hoặc nhiều interface.
class Student : FirstInterface {
override fun add() {
}
}
Thuộc tính trong interfaces
Chúng ta có thể khai báo các thuộc tính trong interfaces. Một thuộc tính khai báo trong interface có thể là abstract hoặc có thể được hiện thực. Thuộc tính trong interface không có trường sao lưu (backing fields), và không có sự tham khảo đến trường sao lưu của thuộc tính trong interface.
interface FirstInterface {
val number: Int
val name get() = this::class.java.simpleName
fun add()
fun printName() {
println(this::class.java.simpleName)
}
}class Student : FirstInterface {
override val number: Int = 39
override fun add() {
}
}
Tính kế thừa trong Interface
Một interface có thể kế thừa từ các interface khác với các thuộc tính và hàm, nó có thể thêm nhiều thuộc tính và hàm. Hiển nhiên là một lớp hiện thực interface này cần phải hiện thực các thuộc tính hay đối tượng chưa được hiện thực ở interface.
interface FirstInterface {
val name: String
}interface Person: FirstInterface {
val firstName: String
val lastName: String
override val name: String
get() = "$firstName $lastName"
fun printName()
}class Student(
override val firstName: String,
override val lastName: String,
val score: Int
) : Person {
override fun printName() {
println(name)
}
}
Giải quyết đụng độ với interface
Một lớp đôi khi có sự đụng độ xảy ra nếu kế thừa từ nhiều interface có cùng tên hàm. Để giải quyết vấn đề này thì ta cần phải chỉ rõ interface nào được gọi từ lớp hàm hiện thực trước.
interface First {
fun doSomething() {
println("First doSomething")
} fun talk() {
println("First talk")
}
}interface Second {
fun doSomething() { println("Second doSomething")}
fun talk()
}class S : First, Second {
override fun talk() {
super.talk()
}override fun doSomething() {
super<First>.doSomething()
super<Second>.doSomething()
}
}
Ví dụ ở đây chúng ta có hai interface là First và Second. Chúng có các hàm có tên giống nhau là doSomething và talk. Ở interface First thì cả hai hàm đã được hiện thực sẵn, và ở interface Second chỉ có doSomething đã được hiện thực. Khi lớp S hiện thực cả hai interface thì nó muốn gọi lại những hiện thực sẵn thì chúng ta cần chỉ rõ gọi hàm ở interface nào. Việc này tương tự như một lớp kế thừa từ lớp cha và interface có cùng tên hàm xem lại lớp và kế thừa nếu bạn chưa xem bài trước.
Cảm ơn các bạn đã đọc bài. Đăng ký kênh chúng tôi để xem những bài học mới nhất.
Youtube kênh: https://bit.ly/2EFOOXs
Thảo luận bằng cách comment ở đây hoặc trong video của blog này.