写代码的时候,总有人搞混Kotlin里的接口和抽象类。其实它们就像家里的两种门——防盗门和推拉门,看着都能进出,但用的地方不一样。
接口:规定你能做什么
接口就像一份契约,只告诉你“你能开门”,但不管你怎么开。在Kotlin里,接口用 interface 声明,里面的方法默认是公开的,也可以带实现。
interface Lockable {
fun lock()
fun unlock()
fun logAction() {
println("操作记录已保存")
}
}
你看,logAction() 直接有实现,谁实现这个接口就自动拥有这个功能。这就像智能锁自带记录功能,不用每个门单独加。
抽象类:部分实现,留点自由
抽象类更像是半成品门,有些部件已经装好了,但关键部分还得你自己动手。它用 abstract class 定义,可以有构造函数,也能包含具体方法和抽象方法。
abstract class SecurityDoor {
val material = "钢铁"
abstract fun installPeephole()
fun open() {
println("安全门打开了")
}
}
子类必须实现 installPeephole(),但可以直接用 open()。这就像每扇安全门都得装猫眼,但开门方式统一由厂家定好。
怎么选?看实际需求
如果你只是想统一行为规范,比如“所有设备都要能开关”,那就用接口。多个接口还能同时实现,像一个门既能刷卡又能指纹。
如果有一堆相似的东西,共用不少代码,比如“防盗门、防火门都用钢铁做”,那就从抽象类起步更省事。
项目里有个老系统升级,原来各种门五花八门。我们把通用逻辑抽成抽象类,行为协议做成接口,新代码清爽多了,出错也少了。
说白了,接口管“能干嘛”,抽象类管“有什么”。搞清楚这点,写代码就跟配钥匙一样,对上槽口就行。