文章目录
- 定义
- 构造函数
- 普通成员(属性或方法)
- 抽象成员(属性或方法)
- 实例化抽象类
- 使用伴生对象继承抽象类
定义
在 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()
}
由 提供者 提供