Kotlin接口:从入门到精通

Kotlin接口:从入门到精通 Kotlin 接口的基本概念Kotlin 接口是一种定义行为契约的方式允许类通过实现接口来承诺提供某些功能。接口可以包含抽象方法、默认实现方法以及属性。与抽象类不同接口不能存储状态但可以定义带有实现的属性和方法。interface Animal { fun makeSound() fun eat() { println(Animal is eating) } }接口的实现类可以通过implements关键字实现一个或多个接口。实现接口的类必须提供接口中所有抽象方法的具体实现除非这些方法已经在接口中提供了默认实现。class Dog : Animal { override fun makeSound() { println(Bark!) } } fun main() { val dog Dog() dog.makeSound() // 输出: Bark! dog.eat() // 输出: Animal is eating }接口中的属性接口可以定义抽象属性或带有自定义 getter 的属性。实现接口的类必须提供这些属性的具体实现。interface Named { val name: String val description: String get() This is $name } class Person(override val name: String) : Named fun main() { val person Person(Alice) println(person.name) // 输出: Alice println(person.description) // 输出: This is Alice }多接口继承Kotlin 支持多接口继承一个类可以实现多个接口。如果多个接口有相同的方法签名实现类必须明确指定如何解决冲突。interface A { fun foo() { println(As foo) } } interface B { fun foo() { println(Bs foo) } } class C : A, B { override fun foo() { superA.foo() superB.foo() } } fun main() { val c C() c.foo() // 输出: As foo Bs foo }接口的默认方法Kotlin 允许在接口中为方法提供默认实现。实现类可以选择使用默认实现或覆盖它。interface Logger { fun log(message: String) { println(Default log: $message) } } class ConsoleLogger : Logger { override fun log(message: String) { println(Custom log: $message) } } fun main() { val logger ConsoleLogger() logger.log(Hello) // 输出: Custom log: Hello }接口与抽象类的区别接口和抽象类在 Kotlin 中有一些关键区别接口不能存储状态而抽象类可以。类可以实现多个接口但只能继承一个抽象类。接口的方法可以有默认实现抽象类的方法可以有具体实现。abstract class AbstractAnimal { abstract fun move() fun sleep() { println(Sleeping) } } interface Swimmable { fun swim() } class Fish : AbstractAnimal(), Swimmable { override fun move() { println(Swimming) } override fun swim() { println(Fish is swimming) } } fun main() { val fish Fish() fish.move() // 输出: Swimming fish.swim() // 输出: Fish is swimming fish.sleep() // 输出: Sleeping }接口作为函数参数接口可以作为函数的参数类型使得函数可以接受任何实现了该接口的类的实例。interface Clickable { fun onClick() } class Button : Clickable { override fun onClick() { println(Button clicked) } } fun handleClick(clickable: Clickable) { clickable.onClick() } fun main() { val button Button() handleClick(button) // 输出: Button clicked }接口的扩展函数Kotlin 允许为接口添加扩展函数从而在不修改接口定义的情况下为其添加新功能。interface Greeter { fun greet() } fun Greeter.greetLoudly() { println(HELLO!) } class FriendlyGreeter : Greeter { override fun greet() { println(Hello) } } fun main() { val greeter FriendlyGreeter() greeter.greet() // 输出: Hello greeter.greetLoudly() // 输出: HELLO! }接口的 SAM 转换对于只有一个抽象方法的接口SAM 接口Kotlin 支持 SAM 转换允许使用 lambda 表达式代替接口实例。fun interface StringPredicate { fun accept(s: String): Boolean } fun filterStrings(strings: ListString, predicate: StringPredicate): ListString { return strings.filter(predicate::accept) } fun main() { val strings listOf(Kotlin, Java, Python) val result filterStrings(strings) { it.length 4 } println(result) // 输出: [Kotlin, Python] }接口的委托Kotlin 支持通过委托模式将接口的实现委托给另一个对象使用by关键字。interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { println(x) } } class Derived(b: Base) : Base by b fun main() { val b BaseImpl(10) Derived(b).print() // 输出: 10 }通过这些示例和说明可以清晰地理解 Kotlin 接口的功能和用法。接口在 Kotlin 中是一种强大的工具用于定义行为契约和实现多态性。