第二部分:面向对象编程与 Kotlin 特性
第 5 章:类与对象
5.5 接口与实现
1. 接口的定义与特点
在 Kotlin 中,**接口(Interface)**用于定义一组抽象行为或契约,允许类通过实现接口来提供具体功能。接口的特点包括:
- 可以包含抽象方法(无默认实现)或带有默认实现的方法。
- 支持声明抽象属性(需在实现类中初始化)。
- 允许多重实现(一个类可实现多个接口)。
- 接口本身不能保存状态(不能直接声明字段)。
示例:
interface Drawable {
fun draw() // 抽象方法
val color: String // 抽象属性
fun resize(scale: Double) { // 带默认实现的方法
println("Resizing to $scale")
}
}
2. 接口的实现
类通过 : 符号实现接口,需重写所有抽象成员。若接口方法有默认实现,可选择是否重写。
示例:
class Circle : Drawable {
override val color: String = "Red" // 实现抽象属性
override fun draw() { // 实现抽象方法
println("Drawing a circle with color $color")
}
// resize() 使用默认实现,无需重写
}
3. 多接口冲突解决
若多个接口有相同方法签名(包括默认实现),需在实现类中显式解决冲突:
interface A {
fun foo() { println("A") }
}
interface B {
fun foo() { println("B") }
}
class C : A, B {
override fun foo() {
super<A>.foo() // 显式调用 A 的实现
super<B>.foo() // 显式调用 B 的实现
}
}
4. 接口 vs 抽象类
| 特性 | 接口 (interface) | 抽象类 (abstract class) |
|---|---|---|
| 状态 | ❌ 不能保存字段 | ✅ 可以保存字段 |
| 构造函数 | ❌ 不能有构造函数 | ✅ 可以有主/次构造函数 |
| 多重继承 | ✅ 支持多实现 | ❌ 单继承 |
| 默认方法实现 | ✅ 支持 | ✅ 支持 |
5. 实际应用场景
- 功能扩展:通过接口为不同类添加统一行为(如
Comparable排序)。 - 依赖注入:定义服务接口,由具体实现类注入。
- 多态设计:基于接口编程,降低模块耦合度。
6. 完整示例
interface Logger {
fun log(message: String)
}
class ConsoleLogger : Logger {
override fun log(message: String) {
println("[Console] $message")
}
}
class FileLogger(private val filePath: String) : Logger {
override fun log(message: String) {
java.io.File(filePath).appendText("[File] $message\n")
}
}
fun main() {
val loggers: List<Logger> = listOf(ConsoleLogger(), FileLogger("log.txt"))
loggers.forEach { it.log("Hello Kotlin!") }
}
关键点总结
- 优先使用接口实现多态,而非类继承。
- 通过
override关键字显式实现接口成员。 - 利用默认方法减少重复代码。
- 注意多接口冲突时的解决语法
super<T>.method()。
