[polldaddy poll=9764234]
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ụ:
[code language=”groovy”]
/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array) {
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)
}
[/code]
Ở 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à UserName và Password
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ụ:
[code language=”groovy”]
/**
* Created by cafe on 01/06/2017.
*/
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 113
}
}
[/code]
Ở 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:
[code language=”groovy”]
/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array) {
val demo = Outer.Nested().foo()
println(demo)
}
[/code]
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
[code language=”groovy”]
package inner
/**
* Created by cafe on 01/06/2017.
*/
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
[/code]
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:
[code language=”groovy”]
package inner
import inner.Outer
/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array) {
val demo = Outer().Inner().foo()
println(demo)
}
[/code]
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:
[code language=”groovy”]
enum class XepLoai {
XuatSac,Gioi,Kha,TrungBinh,Yeu,Kem
}
[/code]
Ta có thể sử dụng Enum này như sau:
[code language=”groovy”]
/**
* 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
}
}
[/code]
Tạo main để triệu gọi như sau:
[code language=”groovy”]
fun main(args: Array) {
var teo=SinhVien()
teo.DiemTrungBinh=9.0
println(teo.XepLoaiHocTap())
}
[/code]
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://communityuni.com/)
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
cám ơn chia sẻ hữu ích của thầy
thầy cho em hỏi, fun foo() = bar nghĩa là giá trị trả về của hàm sẽ là bar ạ