Kotlin:为什么使用抽象类(与接口(interface)相比)?

标签 kotlin abstract-class

我知道 Kotlin 中抽象类和接口(interface)之间的两个区别:

  • 一个抽象类可以有状态(例如var...)
  • 一个类可以实现多个接口(interface),但不能实现多个抽象类。

既然 Kotlin 是一门比较新鲜的语言,我想知道为什么抽象类没有被抛弃?接口(interface)似乎是一种优越的工具,几乎不需要抽象类。

详细说明:Kotlin 确实支持接口(interface)中的具体函数实现,例如:

interface Shiny {

    fun shine(amount : Int)  // abstract function

    fun reflect(s : String) { print ("**$s**") }  // concrete function

}

有人可以提供一个需要抽象类的强大实际示例吗?

最佳答案

抽象类的实用方面是您可以封装与状态一起使用的部分实现,这样它就不会在派生类中被覆盖。

在接口(interface)中,您只能定义一个没有支持字段的属性,并且实现类必须覆盖该属性(使用支持字段或自定义访问器)。

鉴于此,您无法定义以可靠方式在接口(interface)中存储某些状态的逻辑:实现类可能会以意想不到的方式覆盖属性。

例子:

interface MyContainer {
    var size: Int

    fun add(item: MyItem) { 
        // ...
        size = size + 1
    }
}

这里,我们为 add 提供了一个默认实现,它增加了 size。但是如果一个实现类是这样定义的,它可能会中断:

class MyContainerImpl : MyContainer {
    override val size: Int 
        get() = 0
        set(value) { println("Just ignoring the $value") }
}

相反,抽象类支持此用例,因此允许您为其所有实现提供一些保证和契约:它们可以定义一些状态及其在派生类中保持不变的转换。

除此之外,抽象类可以有非公共(public) API(内部的, protected )和最终成员,而接口(interface)不能(它们只能有私有(private)成员,可以在默认实现中使用),以及它们的所有默认实现可以在类中被覆盖。

关于Kotlin:为什么使用抽象类(与接口(interface)相比)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45616548/

相关文章:

android - 使用 RxJava2 和 Retrofit2 Mosby MVI 的 OnErrorNotImplementedException

android - 无法设置约束组的可见性

C# 抽象方法强制更新方法

安卓抽象布局

c++ - 为什么我们不能声明一个 std::vector<Abstract Class>?

c++ - 指向模板抽象类的指针 vector ?

android - 暂停和恢复如何在Android的协程中工作

kotlin - 如何使用Kotlin协程爬网递归结构?

gradle - 为什么 kotlin gradle 插件无法使用 1.8 目标构建?

java - 访问抽象类字段的正确方法?