📜  Kotlin-继承(1)

📅  最后修改于: 2023-12-03 15:02:32.918000             🧑  作者: Mango

Kotlin-继承

在面向对象编程中,继承是一个很重要的概念。Kotlin也提供了继承的机制。在Kotlin中,所有的类默认都是final,不可继承,如果想让类可以被继承,则需要使用open关键字来修饰。

基本语法

下面是一个简单的继承例子:

open class Person(val name: String) {
    fun sayHello() {
        println("Hello, I'm $name!")
    }
}

class Student(name: String, val school: String): Person(name) {
    fun goToSchool() {
        println("$name is going to $school.")
    }
}

fun main() {
    val student = Student("Tom", "Stanford")
    student.sayHello()
    student.goToSchool()
}

在上面的例子中,Person是一个基类,它包含一个属性name和一个成员函数sayHello,Student是Person的子类,它增加了一个属性school和一个成员函数goToSchool。

我们使用关键字class来定义一个类,使用关键字open来修饰Person类,使其允许继承,使用冒号(:)来表示继承关系。

当我们继承一个类时,需要调用基类的构造函数,使用基类的构造函数的语法为: 关键字super。

在我们的例子中,为了将传递给Student构造函数的name参数传递到基类Person的构造函数中,我们使用了关键字super。

覆盖基类成员函数

当我们继承一个类时,有时需要对基类的成员函数进行修改,此时就需要使用到覆盖。

在Kotlin中,我们使用关键字override来标记基类的成员函数被子类的成员函数覆盖了。

下面是一个覆盖例子:

open class Shape {
    open fun draw() {
        println("Drawing a shape")
    }
}

class Circle: Shape() {
    override fun draw() {
        println("Drawing a circle")
    }
}

fun main() {
    val circle = Circle()
    circle.draw()
}

在上面的例子中,我们定义了一个基类Shape和它的一个成员函数draw,Circle是Shape的子类,覆盖了它的draw函数。

在子类中,我们使用关键字override来标记覆盖,重写的函数必须使用override关键字进行标记。

调用基类函数

有时候,在子类中我们需要调用基类的函数,此时可以使用关键字super。

例如,在我们的Circle类中想调用基类的draw函数,可以将draw函数重写,并在其中调用super.draw。

下面是一个调用基类函数的例子:

open class Shape {
    open fun draw() {
        println("Drawing a shape")
    }
}

class Circle: Shape() {
    override fun draw() {
        super.draw()
        println("Drawing a circle")
    }
}

fun main() {
    val circle = Circle()
    circle.draw()
}

在上面的例子中,我们定义了一个基类Shape和它的一个成员函数draw,Circle是Shape的子类,覆盖了它的draw函数,并在其中调用了基类的draw函数。

总结

继承是面向对象编程中一个很重要的概念,在Kotlin中,使用关键字class和冒号(:)来定义继承关系,使用关键字open来标记可继承的类,使用关键字override来标记函数被覆盖,使用关键字super来调用基类函数。