类与 OOP
data class、sealed、object、泛型。
40 分钟
类与 OOP
Kotlin 的 OOP 更简洁:data class 自动生成 equals/hashCode/toString,sealed class 表达受限继承,object 单例,companion object 替代 static。
学习目标
- 掌握 class、属性、构造函数与
data class - 理解
sealed class、object、companion object - 了解泛型与接口默认实现
类与属性
class Track(
val slug: String,
var title: String,
val lessons: MutableList<Lesson> = mutableListOf()
) {
fun addLesson(lesson: Lesson) {
lessons.add(lesson)
}
val lessonCount: Int
get() = lessons.size
}
data class Lesson(val slug: String, val title: String, val order: Int)
fun main() {
val track = Track("kotlin-essentials", "Kotlin 语言入门")
track.addLesson(Lesson("kt-intro", "Kotlin 是什么", 1))
track.addLesson(Lesson("kt-syntax", "基础语法", 2))
println("${track.title}: ${track.lessonCount} 课")
println(track.lessons)
}
主构造函数参数可直接声明为属性;data class 适合 DTO、实体。
sealed class 与 object
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val message: String) : Result<Nothing>()
object Loading : Result<Nothing>()
}
object TrackRegistry {
private val tracks = mutableMapOf<String, Track>()
fun register(track: Track) {
tracks[track.slug] = track
}
fun get(slug: String): Track? = tracks[slug]
}
fun handleResult(result: Result<List<Lesson>>) = when (result) {
is Result.Success -> println("加载 ${result.data.size} 课")
is Result.Error -> println("错误: ${result.message}")
Result.Loading -> println("加载中...")
}
sealed class 子类受限,配合 when 可 exhaustiveness check;object 是线程安全单例。
接口与 companion
interface Repository {
fun findBySlug(slug: String): Track?
fun findAll(): List<Track> = emptyList() // 默认实现
}
class InMemoryRepository : Repository {
companion object {
fun createDefault(): InMemoryRepository = InMemoryRepository()
}
private val store = mutableMapOf<String, Track>()
override fun findBySlug(slug: String): Track? = store[slug]
}
fun main() {
val repo = InMemoryRepository.createDefault()
println(repo.findBySlug("kotlin-essentials"))
}