MST

星途 面试题库

面试题:Kotlin类的继承与多态实现

请描述Kotlin中类继承的语法规则,如何实现方法重写?并且详细说明在Kotlin中如何通过接口和抽象类来实现多态,结合代码示例说明其应用场景及优势。
43.3万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

Kotlin中类继承的语法规则

在Kotlin中,类默认是不可继承的(final),如果想要一个类可以被继承,需要使用open关键字修饰。子类通过:符号来继承父类。示例代码如下:

open class Animal {
    open fun makeSound() {
        println("Animal makes a sound")
    }
}

class Dog : Animal() {
    // 这里会重写父类的makeSound方法
    override fun makeSound() {
        println("Dog barks")
    }
}

方法重写

  1. 重写的方法必须使用override关键字修饰。
  2. 重写方法的签名(方法名、参数列表、返回类型)必须与父类中被重写的方法相同(协变返回类型除外,即子类重写方法的返回类型可以是父类方法返回类型的子类型)。
  3. 父类中被重写的方法必须是open的,否则不能被重写。

通过接口和抽象类实现多态

接口实现多态

接口在Kotlin中是一组抽象方法的集合,一个类可以实现多个接口。接口中的方法默认是抽象的,也可以有默认实现。

interface Flyable {
    fun fly()
}

interface Swimmable {
    fun swim()
}

class Bird : Flyable {
    override fun fly() {
        println("Bird is flying")
    }
}

class Duck : Flyable, Swimmable {
    override fun fly() {
        println("Duck is flying")
    }

    override fun swim() {
        println("Duck is swimming")
    }
}

应用场景:当不同的类需要实现相同的行为,但实现方式不同时,可以使用接口。例如在游戏开发中,不同的角色可能都有“攻击”行为,通过实现一个“Attackable”接口,每个角色类去实现具体的攻击方式。 优势:

  1. 实现多继承的效果,一个类可以实现多个接口,增加了代码的灵活性。
  2. 便于代码的维护和扩展,当需要新增一种行为时,只需要定义一个新接口,并让相关类实现该接口即可。

抽象类实现多态

抽象类是包含一个或多个抽象方法的类,抽象类不能被实例化,它主要为子类提供一个通用的框架。子类必须实现抽象类中的抽象方法。

abstract class Shape {
    abstract fun draw()
}

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

class Rectangle : Shape() {
    override fun draw() {
        println("Drawing a rectangle")
    }
}

应用场景:当有一组相关的类,它们有一些共同的属性和行为,但某些行为的实现方式不同时,可以使用抽象类。例如在图形绘制系统中,不同的图形(圆形、矩形等)都继承自一个抽象的“Shape”类,各自实现自己的绘制方法。 优势:

  1. 提供代码复用,抽象类可以包含一些已经实现的方法,子类可以直接使用。
  2. 强制子类实现某些方法,保证了子类具有特定的行为,符合设计规范。