Inheritance in Kotlin
Inheritance in Kotlin

Inheritance in Kotlin

Kotlin 中的继承

提供方: JetBrains 学院

尽管 Kotlin 具有丰富的函数式编程风格,但它本质上是一种面向对象编程 (OOP) 语言,因此在设计和编写 Kotlin 程序时,您可以运用 OOP 原则。如果您熟悉 OOP 原则,那么您可能听说过继承。Kotlin 是如何处理继承的呢?让我们一起来看看!

打开它

以下是在 Kotlin 中创建类的通常方法:

class Book(val pages: Int, val author: String)

如果你的代码看起来像这样,你就创建了一个 final 类。这意味着这个类以后将无法被继承。你只是禁止了继承。不过别担心,这在 Kotlin 中完全没问题,因为 Kotlin 默认所有类都是封闭的,不允许继承。正如著名软件工程师 Joshua Bloch 所说:“ 要么设计并记录继承,要么就禁止继承 。”

所以,如果您确实确定需要扩展您的 Book 类(父类),这里有一个简单的方法:

open class Book(val pages: Int, val author: String)

如您所见,我们刚刚添加了 open 关键字,现在我们的类可以进行扩展了。首先,让我们修改它:

fun getFullInfo(): String {
        return "$pages pages, $author author, $$cost cost"
    }
}

然后将其扩展:

class Comics(pages: Int, author: String, cost: Float) : Book(pages, author, cost)

如您所见,我们创建了一个新的 Comics 类(子类),作为 Book 类的扩展。目前我们还没有添加任何额外的逻辑,只是将所有参数直接传递给了 Book 主构造函数。让我们通过一个实际示例来验证一下:

fun main() {
    val spidermanBook = Comics(60, "The Universe", 8.99F)
    print(spidermanBook.getFullInfo())
}
// output: 60 pages, The Universe author, $8.99 cost

我们创作了一本多么棒的漫画书啊!

延长

我们还可以向子类添加更多功能:

class Booklet(pages: Int, cost: Float) : Book(pages, "", cost) {
    fun getUSDCost(): String {
        return "$$cost cost"
    }

    fun getEuroCost(): String {
        return "€$cost cost"
    }
}

并加以利用:

fun main() {
    val centralBooklet = Booklet(5, 0.14F)
    print(centralBooklet.getUSDCost())
}
// output: $0.14 cost

因此,我们的继承层次结构将如下所示:

[图片未同步]

当然,有了这种强大的方法,我们也可以让它变得更加复杂:

[图片未同步]

重复使用

你还可以利用子类做更多的事情。让我们创建一个函数来判断你的书是否足够长:

fun isBigBook(book: Book): Boolean {
    return book.pages >= 100
}

请注意,此函数可用于父类和子类:

fun main() {
    val spidermanBook = Comics(113, "The Universe", 8.99F)
    val centralBooklet = Booklet(5, 0.14F)
    println(isBigBook(spidermanBook))
    println(isBigBook(centralBooklet))
}
// output: true false

如您所见,继承机制非常强大。我们可以将 Book 实例的任何子实例传递给 isBigBook() 函数。

结论

如何继承类完全取决于你,但如果你将父类标记为 open ,子类始终可以访问父类的逻辑。你还可以向子类添加任意数量的函数。不过,有一点很重要:不要开放所有类,只开放你需要扩展的类。

331 名学习者喜欢这篇理论文章, 4 名学习者不喜欢。 你呢?

报告拼写错误

相关条目

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注