原文: https://www.programiz.com/kotlin-programming/abstract-class
在本文中,您将了解抽象类以及如何在 Kotlin 中实现抽象类(借助示例)。
与 Java 一样,abstract
关键字用于在 Kotlin 中声明抽象类。 无法实例化抽象类(不能创建抽象类的对象)。 但是,您可以从它们中继承子类。
除非您明确使用abstract
关键字将其抽象,否则抽象类的成员(属性和方法)是非抽象的。 让我们举个例子:
abstract class Person {
var age: Int = 40
fun displaySSN(ssn: Int) {
println("My SSN is $ssn.")
}
abstract fun displayJob(description: String)
}
这里,
- 创建一个抽象类
Person
。 您不能创建该类的对象。 - 该类具有非抽象属性
age
和非抽象方法displaySSN()
。 如果您需要在子类中覆盖这些成员,则应使用open
关键字标记它们。 - 该类具有抽象方法
displayJob()
。 它没有任何实现,必须在其子类中覆盖。
注意:抽象类始终处于打开状态。 您不需要显式使用open
关键字从它们继承子类。
示例:Kotlin 抽象类和方法
abstract class Person(name: String) {
init {
println("My name is $name.")
}
fun displaySSN(ssn: Int) {
println("My SSN is $ssn.")
}
abstract fun displayJob(description: String)
}
class Teacher(name: String): Person(name) {
override fun displayJob(description: String) {
println(description)
}
}
fun main(args: Array<String>) {
val jack = Teacher("Jack Smith")
jack.displayJob("I'm a mathematics teacher.")
jack.displaySSN(23123)
}
运行该程序时,输出为:
My name is Jack Smith.
I'm a mathematics teacher.
My SSN is 23123.
在这里,类Teacher
从抽象类Person
派生。
实例化了Teacher
类的对象jack
。 在创建时,我们已将"Jack Smith"
作为参数传递给主构造器。 这将执行Person
类的初始化块。
然后,使用jack
对象调用displayJob()
方法。 请注意,displayJob()
方法在基类中被声明为抽象,而在派生类中被覆盖。
最后,使用jack
对象调用displaySSN()
方法。 该方法是非抽象的,并且在Person
类中声明(并且不在Teacher
类中声明)。
推荐阅读:, Kotlin 接口
Kotlin 接口类似于抽象类。 但是,接口无法存储状态,而抽象类可以。
意思是,接口可能具有属性,但是它必须是抽象的,或者必须提供访问器实现。 而抽象类的属性不是强制性的。