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


Trong bài 24 Tui đã trình bày chi tiết các loại phương thức, tham chiếu this, overloading, parameter list… là một trong những kỹ thuật rất quan trọng trong lập trình hướng đối tượng. Trong bài này Tui tiếp tục trình bày về Data Classes, Nested Classes, Inner Classes, Enum Classes trong Kotlin là một trong những kỹ thuật khá thú vị trong lập trình hướng đối tượng và Kotlin.

1)Data Classes

Trong quá trình xử lý, ta rất thường xuyên chỉ cần lưu trữ dữ liệu mà không có các phương thức. Kotlin hỗ trợ chức năng này bằng cách giúp ta tạo một lớp đặc biệt, lớp này gọi là Data Class.

Các Data Class trong Kotlin sẽ tự động cung cấp:

  • equals() / hashCode()
  • toString()
  • componentN()
  • copy()

Ví dụ:


/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array<String>) {
data class User(var UserName:String,var Password:String)
var user1=User(UserName = "obama",Password = "113@114Xa")
var user1Copy=user1.copy()
var user2Copy=user1.copy(Password ="cohangxom" )
println(user1.toString())
println(user1Copy.toString())
println(user2Copy.toString())
println("User Name của user 1="+user1.UserName)
}

Ở dòng số 5, ta thấy một Data Class tên là User được tạo ra, nó có 2 thuộc tính là UserNamePassword

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

User(UserName=obama, Password=113@114Xa)
User(UserName=obama, Password=113@114Xa)
User(UserName=obama, Password=cohangxom)
User Name của user 1=obama

2)Nested Class

Kotlin giống như các ngôn ngữ lập trình khác, đó là khả năng cho phép Lớp này nằm trong lớp khác dạng Nested. Cần lưu ý là các lớp Nested sẽ không thể truy suất được các biến thành viên trong Outer class

ví dụ:


/**
* Created by cafe on 01/06/2017.
*/
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 113
}
}

Ở ví dụ trên thì phương thức foo() trong Nested class không thể truy suất được tới biến bar trong Outer class

Khi triệu khoi foo() ta làm như sau:


/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array<String>) {
val demo = Outer.Nested().foo()
println(demo)
}

Chạy chương trình ta sẽ được kết quả là 113 xuất ra màn hình.

3) Inner Classes

Kotlin giống như các ngôn ngữ lập trình khác, đó là khả năng cho phép Lớp này nằm trong lớp khác dạng Inner. Cần lưu ý là các lớp Inner sẽ có thể truy suất được các biến thành viên trong Outer class


package inner

/**
* Created by cafe on 01/06/2017.
*/
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}

Code ở trên ta thấy dùng từ khóa inner đằng trước class Inner

hàm main sử dụng như sau:


package inner

import inner.Outer

/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array<String>) {
val demo = Outer().Inner().foo()
println(demo)
}

Chạy chương trình ta sẽ được kết quả là 1 xuất ra màn hình.

Ở đây ta để ý có sự khác biệt giữa Nested Class và Inner class cả cách khai báo cũng như cách truy suất (hãy tự để ý kỹ nó khác chỗ nào).

4)Enum Classes

Enum cũng là một loại Lớp đặc biệt trong Kotlin (giống như các ngôn ngữ khác C#, java…)

Cách khai báo Enum trong Kotlin rất đơn giản, tương tự như các ngôn ngữ lập trình khác.

Lúc new File ta chọn Kind là Enum class, Name là nơi đặt tên Enum. Ví dụ đặt là XepLoai:


enum class XepLoai {
XuatSac,Gioi,Kha,TrungBinh,Yeu,Kem
}

Ta có thể sử dụng Enum này như sau:


/**
* Created by cafe on 01/06/2017.
*/
class SinhVien {
var Ma:Int=0
var Ten:String=""
var DiemTrungBinh:Double=0.0
public fun XepLoaiHocTap():XepLoai
{
if(DiemTrungBinh>=9)return XepLoai.XuatSac
if(DiemTrungBinh>=8)return XepLoai.Gioi
if(DiemTrungBinh>=7)return XepLoai.Kha
if(DiemTrungBinh>=5)return XepLoai.TrungBinh
if(DiemTrungBinh>=3)return XepLoai.Yeu
return XepLoai.Kem
}
}

Tạo main để triệu gọi như sau:


fun main(args: Array<String>) {
var teo=SinhVien()
teo.DiemTrungBinh=9.0
println(teo.XepLoaiHocTap())
}

Chạy chương trình ta sẽ có kết quả là XuatSac.

Như vậy tới đây Tui đã trình bày xong các loại class đặc biệt trong Kotlin(Data Classes, Nested Classes, Inner Classes và Enum classes). 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 (Kế thừa rất quan trọng), 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/8r7z95j8r9lptob/HocOOPPhan4.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/)

2 responses

  1. […] Bài 25-Lập trình hướng đối tượng trong Kotlin – phần 4 […]

  2. Em hỏi, công dụng của Enum class là gì vậy ạ ? Nếu thay vì dùng Enum class em dùng mảng hay collect có khác gì không thầy ? Em cảm ơn thầy

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: