Kotlin 抽象类

定义

在 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()
}
由 提供者 提供
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值