Bài 24-Lập trình hướng đối tượng trong Kotlin – phần 3

[polldaddy poll=9764234]

Trong bài 23 Tui đã trình bày các quy tắc tạo lớp, constructor, thuộc tính, getter/setter, phương thức.  Trong bài này Tui tiếp tục trình bày về các Loại phương phức, tham chiếu this và Kỹ thuật Overloading Method trong Kotlin.

1)Các loại phương thức trong OOP:

Trong lập trình hướng đối tượng, Người ta chia phương thức ra làm 2 loại Service method và Support method.

Service Method là các phương thức public để cung cấp ra ngoài cho các đối tượng sử dụng

Support Method là các phương thức private dùng để hỗ trợ cho các Service method. Các đối tượng ở ngoài không thể truy suất tới các Support Method

Ví dụ:

[code language=”groovy”]

/**
* Created by cafe on 01/06/2017.
*/
class TamGiac {
private var canhA: Double = 0.0
private var canhB: Double = 0.0
private var canhC: Double = 0.0

public var CanhA:Double
get() {return canhA}
set(value) {canhA=value}
public var CanhB:Double
get() {return canhB}
set(value) {canhB=value}
public var CanhC:Double
get() {return canhC}
set(value) {canhC=value}

/**
* Đây là service method
*/
public fun chuVi(): Double {
return canhA + canhB + canhC.toDouble()
}

/**
* Đây là support method
*/
private fun nuaChuVi(): Double {
return chuVi() / 2
}
/**
* Đây là service method
*/
public fun dienTich(): Double {
val p = nuaChuVi()
return Math.sqrt(p * (p – canhA) * (p – canhB) * (p – canhC))
}
}

[/code]

Ở Trên bạn quan sát phương thức nuaChuVi() là support method vì nó để private, phương thức này sẽ hỗ trợ các Service method khác như: dienTich()

Ở Ngoài chỉ có thể truy suất được các phương thức là Service Method, không thể truy suất được tới Support Method, ví dụ:

[code language=”groovy”]

/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array) {
var tg1= TamGiac()
tg1.CanhA=12.0
tg1.CanhB=17.0
tg1.CanhC=14.0
var dt=tg1.dienTich()
var cv=tg1.chuVi()

//var nucv=tg1.nuaChuVi() //lệnh này sẽ báo lỗi vì nuaChuVi() ko thể truy suất
println(“Diện tích =$dt”)
println(“Chu vi = $cv”)
}

[/code]

Kết quả khi chạy ta thấy:

Diện tích =83.0267276243018
Chu vi = 43.0

2)Tham chiếu this:

Tham chiếu this rất quan trọng trong các ngôn ngữ lập trình, C#, Java…cũng sử dụng tham chiếu this. Để hiểu được tham chiếu this ta cần đi từ khái niệm Instance variablelocal variable

Instance variable là các thuộc tính, các biến khai báo ngoài lớp. Toàn bộ các hàm trong lớp điều có thể truy suất được.

Local variable là các biến được khai báo trong đối số của hàm hoặc nội dung hàm. Chỉ có hàm này mới truy suất được các biến local variable của nó, các đối số trong hàm thường được mặc định là readOnly(val)

Hình dưới đây sẽ minh họa 2 loại biến trên:Rõ ràng ta thấy biến banKinh ở dòng lệnh số 5 là instance variable. Biến banKinh ở dòng số 6 và biến bk ở dòng 8 là local variables.

Khi chúng ta rành các quy tắc về OOP, ta có thể dùng công cụ để tạo ra các constructor, các hàm. Rất thường xuyên chúng ta gặp trường hợp instance variable và local variable trùng tên nhau. Vậy làm sao để phân biệt được là chương trình đang gọi loại biến nào. Ví dụ ta quan sát dòng lệnh số 11 ở trên:

this.banKinh=banKinh

Chúng ta có lưu ý quan trọng sau:

Nếu tại một dòng lệnh mà đồng thời cùng truy suất tới instance variable và local variable(cùng tên) thì chương trình sẽ ưu tiên truy suất tới biến local variable

Tức là nếu như dòng lệnh số 11 ta xóa từ khóa this đi, sẽ trở thành:Vì như đã nói ở trên, Nếu tại một vị trí mà cùng truy suất tới instance và local cùng tên thì chương trình sẽ ưu tiên xử lý cho local. Tức nó nó sẽ cùng tham chiếu tới biến local. Như hình trên Tui vẽ 2 biến banKinh ở dòng 11 cùng trỏ tới biến banKinh ở dòng 6=> Như vậy rõ ràng nó sinh ra lỗi (lỗi thứ nhất là tham chiếu sai ý định, lỗi thứ 2 là mặc định các biến khai báo trong đối số của hàm thì Kotlin cho là readOnly(val) nên không thể đổi giá trị được).

Vì vậy trong trường hợp này bắt buộc ta phải dùng từ khóa this nhằm chỉ thị rõ cho chương trình : đây là đối tượng hiện tại trong lớp, phải truy suất tới Instance Variable. Do đó ta phải dùng từ khóa this là vậy, lúc này tham chiếu sẽ như sau:

3)Kỹ thuật Overloading Method

Overloading Method là một trong những kỹ thuật rất quan trọng trong lập trình OOP, Kotlin cũng hỗ trợ tính năng này.

  • Overloading Là đặc điểm trong cùng 1 lớp có nhiều phương thức cùng tên nhưng khác nhau về Signature.
  • Signature bao gồm: Số lượng các đối số hoặc kiểu dữ liệu các đối số hoặc thứ tự các đối số.
  • Kiểu dữ liệu trả về không được tính vào signature
  • Lợi ích của Overloading là khả năng tái sử dụng lại phương thức và giúp việc gọi hàm “uyển chuyển”.
  • Các Constructor là trường hợp đặc biệt của Overloading Method

Ví dụ:

ở ví dụ trên bạn thấy constructor Tui tạo có 3 constructor với số lượng các đối số khác nhau. Và có 2 hàm printInfor với số lượng đối số khác nhau. Đây chính là 2 ví dụ là Overloading Method ==>Giống Tên nhưng khác Signature

Khi chúng ta truy suất tới các phương thức này, thì dựa vào thông số đầu vào mà chương trình tự động điều hướng gọi chính xác phương thức.

[code language=”groovy”]

/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array) {
//Constructor 0 đối số được gọi
var coca=SanPham()
//Constructor 2 đối số được gọi
var pepsi=SanPham(1,”Pepsi”)
//Constructor 3 đối số được gọi
var biaSaiGon=SanPham(2,”Bia Sài Gòn”,15.5)
//Phương thức 0 đối số được gọi
pepsi.printInfor()
//Constructor 3 đối số được gọi
coca.printInfor(5,”Cô Ca Cô La la”,25.0)
}

[/code]

Chắc chắn trong quá trình Coding chúng ta sẽ sử dụng overloading rất là nhiều vì lợi ích to lớn của nó, bài học này giúp các bạn biết được cách cài đặt kỹ thuật overloading, khi vào dự án cụ thể bạn có thể áp dụng.

Ngoài ra Kotlin còn hỗ trợ một loại Overloading Method đặc biệt đó là vararg (còn gọi là Parameter list) . Đây chính là trường hợp đặc biệt của Overloading Method (signature là số lượng các đối số khác nhau). Khi khai báo vararg  ta có thể truyền bao nhiêu đối số vào hàm cũng được.

Ví dụ:

[code language=”groovy”]

/**
* Created by cafe on 01/06/2017.
*/
fun printNumbers(vararg numbers: Int) {
for (number in numbers) {
println(number)
}
}

fun main(args: Array) {
printNumbers(1)
printNumbers(7,8)
printNumbers(9,10,11,12)
}

[/code]

ở trên hàm printNumbers là 1 Overloading Method đặc biệt, ta có thể truyền bao nhiêu đối số cũng được.

Kết quả khi chạy ta thấy:

1
7
8
9
10
11
12

Như vậy tới đây Tui đã trình bày xong các loại phương thức trong Kotlin, tham chiếu this, kỹ thuật Overloading Method. Đây là một trong kiến thức rất quan trọng trong lập trình OOP và 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ẽ tiếp tục trình bày về OOP trong Kotlin ( Data Classes, Nested Class, Enum Class trong Kotlin), các bạn chú ý theo dõi

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/9t1b3sji51dscl5/HocOOPPhan3.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://communityuni.com/)