Kotlin接口与抽象类:别再傻傻分不清(进阶教程)

写代码的时候,总有人搞混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()。这就像每扇安全门都得装猫眼,但开门方式统一由厂家定好。

怎么选?看实际需求

如果你只是想统一行为规范,比如“所有设备都要能开关”,那就用接口。多个接口还能同时实现,像一个门既能刷卡又能指纹。

如果有一堆相似的东西,共用不少代码,比如“防盗门、防火门都用钢铁做”,那就从抽象类起步更省事。

项目里有个老系统升级,原来各种门五花八门。我们把通用逻辑抽成抽象类,行为协议做成接口,新代码清爽多了,出错也少了。

说白了,接口管“能干嘛”,抽象类管“有什么”。搞清楚这点,写代码就跟配钥匙一样,对上槽口就行。