Khai báo đối tượng
Thuộc phần Lập trình hướng đối tượng trong hành trình Kotlin của Coddy. Bài học 12 trên 57.
object Name { ... } khai báo một lớp và đối tượng duy nhất của lớp đó chỉ trong một bước. Bạn dùng đối tượng bằng tên của nó; không cần gọi hàm khởi tạo:
object AppConfig {
var theme = "light"
val version = "1.4"
fun describe() = "v$version, $theme theme"
}Bên trong main:
println(AppConfig.describe())
AppConfig.theme = "dark"
println(AppConfig.describe())Đầu ra:
v1.4, light theme
v1.4, dark themeChỉ có đúng một đối tượng, vì vậy mọi phần của chương trình sử dụng đối tượng này đều đọc và thay đổi cùng một trạng thái. Đối tượng được tạo khi sử dụng lần đầu, như khối init bên dưới cho thấy:
object Visits {
var count = 0
private set
init { println("Visits created") }
fun record() { count++ }
}
fun home() = Visits.record()
fun about() { Visits.record(); Visits.record() }Bên trong main:
println("start")
home()
about()
println(Visits.count)Đầu ra:
start
Visits created
3Đối tượng không có hàm khởi tạo vì không ai tạo ra nó. Các thuộc tính nhận giá trị trong phần khai báo hoặc trong init. Ngoài ra, đây là một thân lớp bình thường: trạng thái riêng tư, các hàm trợ giúp riêng tư và các phương thức công khai:
object IdGenerator {
private var next = 1
fun newId(prefix: String) = "$prefix-${pad(next++)}"
private fun pad(n: Int) = n.toString().padStart(3, '0')
}Bên trong main:
println(IdGenerator.newId("user"))
println(IdGenerator.newId("order"))Đầu ra:
user-001
order-002Dùng một đối tượng cho thứ chỉ có đúng một trong chương trình: một danh mục đăng ký, cấu hình hoặc một nhóm hàm trợ giúp. Đối tượng là trạng thái toàn cục mà bất kỳ tệp nào cũng có thể thay đổi, vì vậy hãy giữ các hàm thiết lập của nó ở chế độ riêng tư và để các phương thức của nó kiểm tra mọi thay đổi.
object Units {
fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0) // gọi qua tên
// val u = Units() // lỗi: đối tượng không có hàm khởi tạoThử thách
DễHoàn thiện đối tượng Leaderboard. Đối tượng này lưu điểm của từng người chơi trong một từ điển riêng tư. add(player, points) cộng điểm, top() trả về người dẫn đầu dưới dạng ada 6 (nếu bằng điểm, tên đứng trước theo thứ tự bảng chữ cái) hoặc empty khi không ai có điểm, reset() xóa tất cả người chơi và thuộc tính players là số người chơi.
Các hàm trợ giúp recordWin và recordDraw trong Functions.kt đã được cung cấp: chúng dùng Leaderboard từ một tệp khác. Code được cung cấp đọc các lệnh win ada, draw ada bo, top hoặc reset, in ra top() mỗi khi gặp top và cuối cùng in players: kèm theo số người chơi.
Code của bạn nằm trong Leaderboard.kt và Functions.kt. Main.kt chứa code đầu vào/đầu ra đã được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
fun main() {
// Đoạn code đầu vào/đầu ra được cung cấp sẵn: giữ nguyên
val input = generateSequence(::readLine).toList()
for (cmd in input) {
val p = cmd.split(" ")
when (p[0]) {
"win" -> recordWin(p[1])
"draw" -> recordDraw(p[1], p[2])
"reset" -> Leaderboard.reset()
else -> println(Leaderboard.top())
}
}
println("players: ${Leaderboard.players}")
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpHàm khởi tạo chínhKhối init và kiểm tra tính hợp lệHàm khởi tạo phụÔn tập: thẻ thư viện4Kế thừa
Lớp mở và lớp conGhi đè thành viênsuper và hàm khởi tạoLớp trừu tượngÔn tập: Danh bạ nhân viên2Thuộc tính và tính đóng gói
Trình truy cập tùy chỉnhBộ sửa đổi phạm vi truy cậpSetter riêng tưlazy và lateinitÔn tập: tài khoản ngân hàng5Giao diện
Khai báo giao diệnPhương thức mặc địnhNhiều giao diệnGiao diện như kiểu dữ liệuÔn tập: Phương thức thanh toán3Đối tượng và đối tượng đồng hành
Khai báo đối tượngĐối tượng đồng hànhHằng số với constBiểu thức đối tượngÔn tập: Phòng bán véTự luyện tập: Playground Kotlin