Tính đa hình (polymorphism) là một khái niệm trong lập trình hướng đối tượng, cho phép một đối tượng có thể thể hiện hành vi khác nhau dựa trên loại của nó. Cụ thể, trong Kotlin, tính đa hình thường được thể hiện thông qua việc sử dụng kế thừa và triển khai các phương thức abstract.
Khi một lớp con kế thừa từ một lớp cha và triển khai lại các phương thức abstract của lớp cha, ta có thể sử dụng đối tượng của lớp con đó như một đối tượng của lớp cha, và hành vi của phương thức abstract sẽ được xác định bởi triển khai trong lớp con đó.
// Raw Model
abstract class BaseRaw<out BM : BaseModel> {
abstract fun raw2Model(): BaseModel
}
class UserRaw(private val firstName: String, private val lastName: String) : BaseRaw<UserModel>() {
override fun raw2Model(): UserModel {
return UserModel(fullName = "$firstName $lastName")
}
}
// Domain Model
abstract class BaseModel
class UserModel(val fullName: String) : BaseModel()
fun main() {
val userRaw = UserRaw(firstName = "Doan", lastName = "Tuan")
val userModel = userRaw.raw2Model()
println("Full name = ${userModel.fullName}")
}
BaseRaw, tham số kiểu BM được khai báo với giới hạn out BaseModel. Điều này có nghĩa là BM phải là một kiểu dữ liệu kế thừa từ BaseModel.BaseRaw cũng sẽ triển khai phương thức raw2Model() và trả về một đối tượng của lớp con kế thừa từ BaseModel.UserRaw, raw2Model() được override lại để thực hiện chuyển đổi dữ liệu từ định dạng raw của người dùng thành một đối tượng UserModel, là một lớp con của BaseModel.raw2Model() trong BaseRaw được khai báo trả về một đối tượng BaseModel, nhưng trong lớp con UserRaw, nó được override để trả về một đối tượng UserModel, là một kiểu con của BaseModel. Điều này thể hiện tính đa hình, khi một phương thức có thể hoạt động khác nhau dựa trên loại thực tế của đối tượng được gọi.