Kế thừa (Inheritance) trong Kotlin
🎯 Mục tiêu: Hiểu kế thừa trong Kotlin với
open,override, và abstract classes.
💡 Khái niệm
Mặc định class trong Kotlin là final (không thể kế thừa). Dùng open để cho phép.
open class Animal(val name: String) {
open fun makeSound() {
println("Some sound")
}
}
class Dog(name: String) : Animal(name) {
override fun makeSound() {
println("Woof!")
}
}📝 Cú pháp
open class Parent {
open val property = "parent"
open fun method() { println("Parent method") }
}
class Child : Parent() {
override val property = "child"
override fun method() { println("Child method") }
}Gọi superclass
class Child : Parent() {
override fun method() {
super.method() // Gọi Parent.method()
println("Child addition")
}
}🔧 Abstract Class
abstract class Shape {
abstract val area: Double
abstract fun draw()
// Non-abstract method
fun printArea() {
println("Area: $area")
}
}
class Circle(val radius: Double) : Shape() {
override val area: Double
get() = Math.PI * radius * radius
override fun draw() {
println("Drawing circle with radius $radius")
}
}🎯 Constructor và Inheritance
open class Parent(val name: String) {
init { println("Parent init: $name") }
}
class Child(name: String, val age: Int) : Parent(name) {
init { println("Child init: $name, $age") }
}
// Output when creating Child("Alice", 25):
// Parent init: Alice
// Child init: Alice, 25⚠️ Lưu ý
⚠️
Không gọi open method trong constructor:
open class Parent {
init { doSomething() } // ❌ Nguy hiểm!
open fun doSomething() { }
}
class Child : Parent() {
val value = "child"
override fun doSomething() {
println(value) // null! (chưa được init)
}
}✅ Checklist
- Dùng
openđể cho phép kế thừa - Dùng
overrideđể ghi đè - Hiểu abstract class vs open class
- Gọi
superkhi cần
Tiếp theo: Interface
Last updated on