面试题答案
一键面试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")
}
}
方法重写
- 重写的方法必须使用
override
关键字修饰。 - 重写方法的签名(方法名、参数列表、返回类型)必须与父类中被重写的方法相同(协变返回类型除外,即子类重写方法的返回类型可以是父类方法返回类型的子类型)。
- 父类中被重写的方法必须是
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”接口,每个角色类去实现具体的攻击方式。 优势:
- 实现多继承的效果,一个类可以实现多个接口,增加了代码的灵活性。
- 便于代码的维护和扩展,当需要新增一种行为时,只需要定义一个新接口,并让相关类实现该接口即可。
抽象类实现多态
抽象类是包含一个或多个抽象方法的类,抽象类不能被实例化,它主要为子类提供一个通用的框架。子类必须实现抽象类中的抽象方法。
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”类,各自实现自己的绘制方法。 优势:
- 提供代码复用,抽象类可以包含一些已经实现的方法,子类可以直接使用。
- 强制子类实现某些方法,保证了子类具有特定的行为,符合设计规范。