Lập trình Kotlin - Phương thức mở rộng
Phương thức mở rộng trong Kotlin
Kotlin hỗ trợ Extensions Method rất tuyệt với, giống như LINQ trong C#(bạn nào quan tâm thì đăng ký học khóa học LinQ C# ở đây). Extensions Method cho phép ta chèn thêm phương thức vào các Lớp có sẵn mà không cần sửa mã nguồn, không cần biết mã nguồn, giống như là cài đặt virus vào một chương trình nào đó.
Cú pháp:
fun [Kiểu_Dữ_Liệu].Tên_Hàm([Các đối số]):[Kiểu_Trả_Về]
{
this ở trong này là đối tượng thuộc [Kiểu_Dữ_Liệu]
}
Khi khai báo như trên, thì bất kỳ [Kiểu_Dữ_Liệu] nào cũng có một hàm mới là Tên_Hàm
Ví dụ 1: Hãy cài đặt hàm Cong (Cộng) vào kiểu Int
fun Int.Cong(a:Int):Int
{
return this+a
}
fun main(args: Array) {
var t=5.Cong(9)
println("t=$t")
var x1=9
var x2=10
var x3=x1.Cong(x2)
println("x3=$x3")
}
Bạn nhìn vào dòng 4 Tui khai báo Int.Cong ==> là cài đặt hàm Cong vào kiểu Int
dòng lệnh số 6 có từ khoa this, this ở đây chính là đối tượng hiện tại của kiểu Int.
Bạn tiếp tục quan sát dòng số 9, thấy số 5.Cong(9) . Vì 5 là số Nguyên kiểu Int mà kiểu Int ta vừa cài đặt hàm Cong nên hiển nhiên 5 sẽ có phương thức Cong. Bạn để ý là Ta không hề biết Kotlin tjao ra Int như thế nào nhưng ta vẫn có thể thêm phương thức Cong vào Int mà không cần biết mã nguồn cũ cũng không cần sửa mã nguồn cũ.
Khi chạy hàm main ở trên thì ta có kết quả sau:
t=14
x3=19
Ví dụ 2: Cài đặt hàm kiểm tra 1 số có phải là số Nguyên Tố hay không vào kiểu Int có sẵn của Kotlin
fun Int.Cong(a:Int):Int
{
return this+a
}
fun Int.KiemTraNguyenTo():Boolean
{
var dem=0
for(i in 1..this)
{
if(this%i==0)
dem++
}
return dem==2
}
fun main(args: Array) {
var t=5.Cong(9)
println("t=$t")
var x1=9
var x2=10
var x3=x1.Cong(x2)
println("x3=$x3")
var a=7
if(a.KiemTraNguyenTo()==true)
{
println("$a là số nguyên tố")
}
else
{
println("$a Ko là số nguyên tố")
}
var b=9
if(b.KiemTraNguyenTo()==true)
{
println("$b là số nguyên tố")
}
else
{
println("$b Ko là số nguyên tố")
}
}
Dòng số 8 ở trên là cài đặt hàm KiemTraNguyenTo() vào kiểu Int
Dòng 27 và 36 là sử dụng hàm KiemTraNguyenTo() có sẵn trong Int (do ta cài vào).
Khi chạy hàm main kết quả như sau:
t=14
x3=19
7 là số nguyên tố
9 Ko là số nguyên tố
Khi chạy kết quả
Ví dụ 3:Cài đặt hàm Tính Tuổi cho Lớp Sinh Viên được viết sẵn của ai đó, Lớp Sinh Viên này có cấu trúc như sau:
import java.util.*
class SinhVien {
private var ma:Int=0
private var ten:String?=null
private var namSinh:Date?=null
public var Ma:Int
get() {return ma}
set(value) {ma=value}
public var Ten:String?
get()= ten
set(value) {ten=value}
public var NamSinh:Date?
get() = namSinh
set(value) {namSinh=value}
constructor(ma: Int, ten: String?, namSinh: Date?) {
this.ma = ma
this.ten = ten
this.namSinh = namSinh
}
}
Vậy làm sao để cài đặt hàm tính tuổi cho lớp Sinh Viên này? (không được đổi mã nguồn cũ). Rất dễ dàng ta làm như sau:
import java.util.*
fun SinhVien.Tuoi():Int
{
var cal=Calendar.getInstance()
var yearHienTai=cal.get(Calendar.YEAR)
cal.time=this.NamSinh
var yearNamSinh=cal.get(Calendar.YEAR)
return yearHienTai-yearNamSinh+1
}
fun main(args: Array) {
var ns=Calendar.getInstance()
ns.set(Calendar.YEAR,1998)
ns.set(Calendar.MONTH,2)
ns.set(Calendar.DAY_OF_MONTH,15)
var teo=SinhVien(1,"Nguyễn Văn Tèo",ns.time)
var tuoiCuaTeo=teo.Tuoi()
println("Tuổi của Tèo="+tuoiCuaTeo)
}
Dòng số 6 ở trên ta cài đặt hàm Tuoi() vào Lớp Sinh Viên. Dựa vào 3 ví dụ ở trên mà bạn có thể áp dụng vào các dự án bất kỳ.
Khi chạy hàm main ở trên thì kết quả là gì?
Tuổi của Tèo=20
Như vậy tới đây Tui đã trình bày xong Extensions Method trong Kotlin. Các bạn chú ý học kỹ, thực hành lại và có gắng hiểu được nó thông qua các ví dụ ở trên nhé. Các bài sau Tui sẽ trình bày về Xử lý File trong Kotlin rất quan trọng trong quá trình xử lý lưu trữ dữ liệu