/** * 第 6 章 · 类与对象 — 综合示例 * * 涵盖:data class / 主构造 + init / 计算属性 / lazy / * 继承 + override / object 单例 / companion object / * sealed class / 解构声明 */ // ========== 1. data class ========== data class User(val id: String, val name: String, val age: Int) // ========== 2. 普通 class + 主构造 + init + 计算属性 ========== class Rectangle(val width: Double, val height: Double) { init { require(width > 0 && height > 0) { "宽高必须为正数" } } val area: Double get() = width * height val perimeter: Double get() = 2 * (width + height) override fun toString() = "Rect(${width}x${height}, area=$area)" } // ========== 3. lateinit + by lazy ========== class Service { lateinit var dependency: String val database: String by lazy { println(" ⏳ 第一次访问,初始化数据库...") "DB-Connection-${System.currentTimeMillis()}" } } // ========== 4. 继承 ========== open class Animal(val name: String) { open fun sound() = "..." fun introduce() = "我是 $name,${sound()}" } class Dog(name: String) : Animal(name) { override fun sound() = "汪汪!" } class Cat(name: String) : Animal(name) { override fun sound() = "喵~" } // ========== 5. 接口 + 多实现 ========== interface Drawable { fun draw(): String } interface Named { val name: String } class Circle(override val name: String, val r: Double) : Drawable, Named { override fun draw() = "画一个圆 $name (r=$r)" } // ========== 6. object 单例 ========== object DatabaseManager { private var connectionCount = 0 fun connect(): String { connectionCount++ return "Connection #$connectionCount" } fun stats() = "总连接数: $connectionCount" } // ========== 7. companion object ========== class HttpClient private constructor(val baseUrl: String) { companion object { const val DEFAULT_TIMEOUT = 5000 fun create(baseUrl: String) = HttpClient(baseUrl) } } // ========== 8. sealed class ========== sealed class Result { data class Success(val data: T) : Result() data class Failure(val error: String) : Result() object Loading : Result() } fun handle(r: Result): String = when (r) { is Result.Success -> "✅ 成功: ${r.data}" is Result.Failure -> "❌ 失败: ${r.error}" Result.Loading -> "⏳ 加载中..." } fun main() { println("=== 1. data class ===") val u1 = User("u001", "Alice", 25) val u2 = User("u001", "Alice", 25) val u3 = u1.copy(age = 26) println("u1 = $u1") println("u1 == u2 ? ${u1 == u2}") // true println("u1 === u2 ? ${u1 === u2}") // false println("u3 = $u3") val (id, name, age) = u1 println("解构: id=$id, name=$name, age=$age") println("\n=== 2. 普通类 + 计算属性 ===") val rect = Rectangle(3.0, 4.0) println(rect) println("周长 = ${rect.perimeter}") try { Rectangle(-1.0, 2.0) } catch (e: IllegalArgumentException) { println("⚠️ 校验失败: ${e.message}") } println("\n=== 3. lateinit 和 lazy ===") val s = Service() s.dependency = "MyDep" println("dependency = ${s.dependency}") println("准备访问 database... (会触发懒初始化)") println("database = ${s.database}") println("再次访问 database (用缓存)") println("database = ${s.database}") println("\n=== 4. 继承 ===") val animals: List = listOf(Dog("旺财"), Cat("咪咪"), Animal("X")) animals.forEach { println(it.introduce()) } println("\n=== 5. 接口 + 多实现 ===") val c = Circle("c1", 5.0) println(c.draw()) println("name (from Named) = ${c.name}") println("\n=== 6. object 单例 ===") DatabaseManager.connect() DatabaseManager.connect() DatabaseManager.connect() println(DatabaseManager.stats()) println("\n=== 7. companion object ===") val client = HttpClient.create("https://api.example.com") println("客户端: ${client.baseUrl}") println("默认超时: ${HttpClient.DEFAULT_TIMEOUT}ms") println("\n=== 8. sealed class + when ===") listOf>( Result.Success("OK"), Result.Failure("网络错误"), Result.Loading, ).forEach { println(handle(it)) } }