Kotlin 继承与多态

预计阅读时间1 分 174 views

在面向对象编程中,继承和多态是实现代码复用和灵活性的强大机制。本文将带你了解 Kotlin 中的继承、多态以及相关概念,包括 openoverride 关键字、抽象类和接口。

继承

  • 继承 (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.")
    }
}

现在,我们可以创建一个继承自 AnimalDog 类:

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") 
    }
}

代码解析:

  1. 定义 Shape 接口,声明 calculateArea() 方法。
  2. Circle 和 Rectangle 类分别实现 Shape 接口,并提供各自的面积计算逻辑。
  3. main 函数中,创建了一个包含 Circle 和 Rectangle 对象的列表 shapes。
  4. 使用 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.")
    }
}
分享此文档

Kotlin 继承与多态

或复制链接

本页目录