Kotlin 继承与多态
在面向对象编程中,继承和多态是实现代码复用和灵活性的强大机制。本文将带你了解 Kotlin 中的继承、多态以及相关概念,包括 open
、override
关键字、抽象类和接口。
继承
- 继承 (Inheritance): 继承允许你创建一个新类(子类)基于现有类(父类),从而继承父类的属性和方法。
- 父类 (Superclass)/ 基类 (Base Class): 被继承的类。
- 子类 (Subclass)/ 派生类 (Derived Class): 继承自父类的类。
在 Kotlin 中,默认情况下类是 final 的,不能被继承。要允许一个类被继承,需要使用 open
关键字修饰:
open class Animal(val name: String) {
open fun makeSound() {
println("The animal makes a sound.")
}
}
现在,我们可以创建一个继承自 Animal
的 Dog
类:
class Dog(name: String) : Animal(name) {
// Dog 类继承了 Animal 类的 name 属性和 makeSound() 方法
}
多态
- 多态 (Polymorphism): 多态允许你使用相同的方法名调用不同类型的对象,并获得不同的行为。
举个通俗的例子:假设你有一个万能遥控器
,上面有一个 “播放” 按钮。你对着电视机按下它,电视机开始播放节目;对着音响按下它,音响开始播放音乐。这就是多态的一种体现:相同的操作 (按下播放按钮),作用于不同的对象 (电视机、音响) 时,会产生不同的行为 (播放节目、播放音乐)。
在编程中,多态允许你使用相同的方法名调用不同类型的对象,并获得不同的行为。 比如,你可以定义一个 “计算面积” 的方法,它可以作用于 “圆形” 对象,也能作用于 “矩形” 对象,程序会根据对象的类型自动选择正确的计算方式。
// 定义一个 Shape 接口
interface Shape {
fun calculateArea(): Double
}
// 圆形类,实现 Shape 接口
class Circle(val radius: Double) : Shape {
override fun calculateArea(): Double {
return Math.PI * radius * radius
}
}
// 矩形类,实现 Shape 接口
class Rectangle(val width: Double, val height: Double) : Shape {
override fun calculateArea(): Double {
return width * height
}
}
fun main() {
val shapes = listOf(Circle(5.0), Rectangle(4.0, 6.0))
for (shape in shapes) {
// 使用相同的方法名调用不同类型的对象
val area = shape.calculateArea()
println("${shape::class.simpleName} 的面积:$area")
}
}
代码解析:
- 定义 Shape 接口,声明 calculateArea() 方法。
- Circle 和 Rectangle 类分别实现 Shape 接口,并提供各自的面积计算逻辑。
- main 函数中,创建了一个包含 Circle 和 Rectangle 对象的列表 shapes。
- 使用 for 循环遍历 shapes 列表,对每个元素调用 calculateArea() 方法计算面积。
override 方法重写
- 方法重写 (Method Overriding): 子类可以重新定义从父类继承的方法。
要重写一个方法,需要在子类中使用 override
关键字修饰:
class Dog(name: String) : Animal(name) {
override fun makeSound() {
println("Woof!")
}
}
抽象类和接口
- 抽象类 (Abstract Class): 抽象类不能被实例化,只能被继承。它可以包含抽象方法和非抽象方法。
- 抽象方法 (Abstract Method): 抽象方法没有实现,需要在子类中重写。
abstract class Animal(val name: String) {
abstract fun makeSound()
fun eat() {
println("$name is eating.")
}
}
- 接口 (Interface): 接口定义了一组方法签名,但没有实现。类可以实现一个或多个接口。
interface Swimmer {
fun swim()
}
一个类可以实现接口并提供方法的具体实现:
class Fish(name: String) : Animal(name), Swimmer {
override fun makeSound() {
println("Blub blub")
}
override fun swim() {
println("$name is swimming.")
}
}