Bài 28-Extensions Method trong Kotlin-OOP phần 7


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


/**
* Created by cafe on 02/06/2017.
*/
fun Int.Cong(a:Int):Int
{
return this+a
}
fun main(args: Array<String>) {
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


/**
* Created by cafe on 02/06/2017.
*/
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<String>) {
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.*

/**
* Created by cafe on 02/06/2017.
*/
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.*

/**
* Created by cafe on 02/06/2017.
*/
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<String>) {
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

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/3wd89egcx10qim7/HocExtension.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://ssoftinc.com/)

4 responses

  1. cho em hỏi, tại sao mình dùng kiêu hàm Type.TenHam(Params): KieuTraVe thì nó có gì ưu điểm hơn là TenHam(Type,Params): KieuTrave vậy thầy ?

    1. Có nhiều ưu điểm hơn, đó là khi em cài đặt hàm nào đó vào 1 kiểu dữ liệu nào đó: Thì bất cứ nơi nào trong hệ thống phần mềm của em Kiểu dữ liệu đó mặc định có chung Hàm vừa cài vào, tạo nên tính nhất quán

  2. return có 2 dấu bằng (==) có ý nghĩa thế nào vậy Thầy?

    1. Hi em
      Đó là viết tắt của true, false đó em . Nếu chúng bằng nhau thì ra true
      Thầy Thanh

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: