11.4

43 阅读1分钟
class Animal() {
    fun eating(): Unit = {
        println("Animal eating")
    }
}

// Dog 继承了 Animal
class Dog extends Animal() {
    override fun eating(): Unit = {
        println("我是狗,我吃饭大口口吃")
    }
}

// Cat 继承了 Animal
class Cat extends Animal() {
    override fun eating(): Unit = {
        println("我是猫,我吃饭小口口吃")
    }
}

// 测试函数
// 它的参数类型是 父类
fun test(animal: Animal): Unit {
    animal.eating()
}

fun main(args: Array<String>): Unit {
    val cat = new Cat()
    val dog = new Dog()
    test(cat) // 传入子类的对象
    test(dog)
}

在这段代码中,Animal 类是父类(基类) ,主要起到以下作用:

1. 定义通用行为模板

Animal 类中定义了 eating 方法,描述了动物 “进食” 这一通用行为的默认实现(打印 “Animal eating”),为所有继承它的子类(如 DogCat)提供了行为的基础模板。

2. 实现多态的核心载体

多态是面向对象的重要特性,表现为 “父类引用可以指向子类对象,且调用方法时执行子类的重写实现”。

  • Dog 和 Cat 类继承 Animal 后,重写了 eating 方法,实现了各自特有的进食行为。
  • test 函数的参数类型是 Animal(父类类型),但实际可以传入 CatDog(子类对象)。当调用 animal.eating() 时,会根据传入的子类对象,执行对应的子类重写方法(如传入 Cat 时执行 “我是猫,我吃饭小口口吃”),这就是多态的体现。Animal 类作为父类类型,是实现这种多态性的关键载体。

3. 代码复用与模块化

通过继承 Animal 类,Dog 和 Cat 无需重复定义 “进食” 行为的框架,只需重写具体实现即可,实现了代码的复用,让类的设计更具模块化和层次性。