Kotlin 抽象类

时间:2024-05-31 13:52:07

文章目录

  • 定义
  • 构造函数
  • 普通成员(属性或方法)
  • 抽象成员(属性或方法)
  • 实例化抽象类
  • 使用伴生对象继承抽象类

定义

在 Kotlin 中,抽象类使用abstract class定义:

abstract class 类名 { 属性/方法 }

我们可以尝试定义一个抽象类:

abstract class Provider

Note:很多情况下抽象类与接口功能其实是差不多的,它们有以下差异:

  • 抽象类可以有构造函数,而接口有。
  • 抽象类中属性可以初始化,而接口只能通过属性get方法给值。
  • 同一个类只能继承一个抽象类,但可以实现多个接口。
  • 抽象类中可以有protected成员(属性或变量),而接口中有。
  • 抽像类中定义的初始化的属性有方法体的方法默认是不可被重写的,而接口中的有方法体的方法默认可被重写(默认被标记为open)。
  • 等等。

构造函数

我们可以像类class那样给抽象类定义主、次构造:

abstract class Provider(val source: String) {
    constructor(): this("Input")
}

普通成员(属性或方法)

抽象类中可以直接定义并初始化属性,定义方法并给出方法体:

abstract class Provider {
    val name = "提供者"
    
    
    fun provide() = print("由 $name 提供")
}

抽象成员(属性或方法)

抽象类中的抽象成员必须使用abstract修饰:

abstract class Provider {
    abstract val name: String


    abstract fun provide()
}

实例化抽象类

与接口类似,我们可以声明一个类型为Any的对象:

fun main() {
    val any: Any = object {
        
    }
}

再让其继承自Provider(与接口不同,这里需要在类名后加上小括号(),如果类构造有参数,也要传入):

abstract class Provider {
    abstract val name: String


    abstract fun provide()
}


fun main() {
    val provider = object: Provider() {

    }
}

鼠标点击标红的object,暂停一段时间(或者按下键盘上的Alt+Enter(回车)),点击实现成员,并在新弹窗中点击确定,即可生成代码。
在这里插入图片描述

fun main() {
    val provider = object: Provider() {
        override val name: String
            get() = TODO("Not yet implemented")

        override fun provide() {
            TODO("Not yet implemented")
        }

    }
}

稍加修改一下,并使用provider调用provide

fun main() {
    val provider = object: Provider() {
        override val name = "提供者"

        override fun provide() = print("由 $name 提供")
    }

    provider.provide()
}
由 提供者 提供

使用伴生对象继承抽象类

我们可以使用companion object继承自抽象类,调用时只需要使用类名即可:

abstract class Provider {
    abstract val name: String


    abstract fun provide()

    companion object : Provider() {
        override val name = "提供者"

        override fun provide() = print("由 $name 提供")
    }
}


fun main() {
    Provider.provide()
}
由 提供者 提供