Xin chào, hôm nay mình sẽ giới thiệu về khái niệm kế thừa lớp trong Kotlin. Đây là một khái niệm rất quan trọng trong lập trình hướng đối tượng. Trong bài viết này, mình sẽ giải thích tại sao khái niệm này lại quan trọng và cách thức thực hiện kế thừa lớp trong Kotlin.
Contents
Định nghĩa kế thừa – tạo liên kết giữa các lớp
Trước tiên, để hiểu rõ hơn về kế thừa lớp, chúng ta sẽ xem xét một ví dụ đơn giản về hai lớp: lớp Animal
và lớp Cat
.
class Animal(var kind: String, var name: String) { }
class Cat(var color: String, kind: String, name: String) : Animal(kind, name) { }
Trong đoạn mã trên, lớp Cat
kế thừa toàn bộ thuộc tính và phương thức của lớp Animal
, đồng thời có thể có các thuộc tính và phương thức riêng mà lớp Animal
không có. Chẳng hạn, thuộc tính color
là một thuộc tính mới của lớp Cat
mà không có trong lớp Animal
.
Vì Cat
kế thừa Animal
, nghĩa là mọi đối tượng của Cat
cũng là một đối tượng Animal
mở rộng và đều có các thuộc tính của Animal
. Bên cạnh đó, Cat
còn có thêm các thuộc tính và phương thức mới riêng của lớp Cat
.
Ở ví dụ trên, chúng ta đã sử dụng từ khóa open
trước khai báo lớp Animal
. Điều này cần thiết vì mặc định trong Kotlin, các lớp được khai báo là final class
, tức là không thể kế thừa. Bằng cách thêm từ khóa open
, chúng ta cho phép lớp Animal
có thể được kế thừa bởi lớp Cat
.
Ghi đè phương thức (Override)
Một tính năng nổi bật khác của kế thừa lớp trong Kotlin là khả năng ghi đè (override) các phương thức của lớp cha. Điều này cho phép lớp con (ví dụ: Cat
) gọi được phương thức của lớp cha (ví dụ: Animal
) và có thể mở rộng chúng.
Cùng xem một ví dụ về ghi đè phương thức. Trong lớp Animal
, chúng ta đã khai báo một phương thức getInfo
:
open class Animal(var kind: String, var name: String) {
open fun getInfo() {
println("Hello, I am a $kind, my name is $name")
}
}
Trong lớp Cat
, chúng ta muốn ghi đè phương thức getInfo
để thêm thông tin về màu lông của mèo. Đây là cách thực hiện:
override fun getInfo() {
super.getInfo()
println("I am $color")
}
Chúng ta sử dụng từ khóa super
để gọi phương thức tương ứng của lớp cha, sau đó chúng ta có thể thực hiện bất kỳ hành động mở rộng nào mà chúng ta muốn.
Sử dụng interface
Interface trong Kotlin tương tự như interface trong Java. Nó chứa các phương thức mà các lớp kế thừa nó sẽ phải thực hiện. Interface cũng có thể định nghĩa các thuộc tính.
Ví dụ, chúng ta có một interface IAction
với hai phương thức makeSound
và eat
. Chúng ta cũng có thể định nghĩa các thuộc tính trong interface. Ví dụ dưới đây cho thấy cách sử dụng interface trong Kotlin:
interface IAction {
fun makeSound()
fun eat(food: String)
}
class Cat(var color: String, kind: String, name: String) : Animal(kind, name), IAction {
override fun makeSound() {
println("Meo meo meo")
}
override fun eat(food: String) {
println("I am eating $food")
}
}
Như bạn có thể thấy, đối tượng Cat
đã có thể sử dụng các phương thức được khai báo trong interface IAction
, nhờ việc kế thừa interface này.
Tổng kết
Vậy là mình đã giới thiệu về khái niệm kế thừa lớp trong Kotlin cùng với ví dụ cụ thể. Hy vọng bạn đã hiểu rõ về cách tạo liên kết mạnh mẽ giữa các lớp thông qua kế thừa lớp. Sử dụng kế thừa lớp và interface, bạn có thể xây dựng các ứng dụng phong phú và linh hoạt hơn.