原文: https://www.programiz.com/kotlin-programming/abstract-class

在本文中,您将了解抽象类以及如何在 Kotlin 中实现抽象类(借助示例)。

与 Java 一样,abstract关键字用于在 Kotlin 中声明抽象类。 无法实例化抽象类(不能创建抽象类的对象)。 但是,您可以从它们中继承子类。

除非您明确使用abstract关键字将其抽象,否则抽象类的成员(属性和方法)是非抽象的。 让我们举个例子:

  1. abstract class Person {
  2. var age: Int = 40
  3. fun displaySSN(ssn: Int) {
  4. println("My SSN is $ssn.")
  5. }
  6. abstract fun displayJob(description: String)
  7. }

这里,

  • 创建一个抽象类Person。 您不能创建该类的对象。
  • 该类具有非抽象属性age和非抽象方法displaySSN()。 如果您需要在子类中覆盖这些成员,则应使用open关键字标记它们。
  • 该类具有抽象方法displayJob()。 它没有任何实现,必须在其子类中覆盖。

注意:抽象类始终处于打开状态。 您不需要显式使用open关键字从它们继承子类。


示例:Kotlin 抽象类和方法

  1. abstract class Person(name: String) {
  2. init {
  3. println("My name is $name.")
  4. }
  5. fun displaySSN(ssn: Int) {
  6. println("My SSN is $ssn.")
  7. }
  8. abstract fun displayJob(description: String)
  9. }
  10. class Teacher(name: String): Person(name) {
  11. override fun displayJob(description: String) {
  12. println(description)
  13. }
  14. }
  15. fun main(args: Array<String>) {
  16. val jack = Teacher("Jack Smith")
  17. jack.displayJob("I'm a mathematics teacher.")
  18. jack.displaySSN(23123)
  19. }

运行该程序时,输出为:

  1. My name is Jack Smith.
  2. I'm a mathematics teacher.
  3. My SSN is 23123.

在这里,类Teacher从抽象类Person派生。

实例化了Teacher类的对象jack。 在创建时,我们已将"Jack Smith"作为参数传递给主构造器。 这将执行Person类的初始化块。

然后,使用jack对象调用displayJob()方法。 请注意,displayJob()方法在基类中被声明为抽象,而在派生类中被覆盖。

最后,使用jack对象调用displaySSN()方法。 该方法是非抽象的,并且在Person类中声明(并且不在Teacher类中声明)。


推荐阅读:, Kotlin 接口

Kotlin 接口类似于抽象类。 但是,接口无法存储状态,而抽象类可以。

意思是,接口可能具有属性,但是它必须是抽象的,或者必须提供访问器实现。 而抽象类的属性不是强制性的。