我知道 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/