MST

星途 面试题库

面试题:Go语言接口的嵌入与多态特性

假设你有一个基础接口 `Animal` 包含 `Speak` 方法,然后有一个接口 `Flyable` 包含 `Fly` 方法。现在定义一个 `Bird` 结构体,让它通过嵌入接口的方式实现 `Animal` 和 `Flyable` 接口。并说明在这种情况下,如何利用多态性实现对不同类型(仅实现 `Animal` 或仅实现 `Flyable` 或两者都实现)对象的统一操作。
43.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

以下是用Go语言实现上述需求的代码:

package main

import "fmt"

// Animal 接口
type Animal interface {
    Speak()
}

// Flyable 接口
type Flyable interface {
    Fly()
}

// Bird 结构体通过嵌入接口来实现Animal和Flyable接口
type Bird struct {
    Animal
    Flyable
}

// 实现Animal接口的Speak方法
func (b Bird) Speak() {
    fmt.Println("Bird is speaking")
}

// 实现Flyable接口的Fly方法
func (b Bird) Fly() {
    fmt.Println("Bird is flying")
}

对于如何利用多态性实现对不同类型对象的统一操作:

  1. 仅实现 Animal 接口的对象:可以将实现了 Animal 接口的对象存储在 Animal 类型的切片中,通过遍历切片调用 Speak 方法。
func operateOnAnimals(animals []Animal) {
    for _, animal := range animals {
        animal.Speak()
    }
}
  1. 仅实现 Flyable 接口的对象:可以将实现了 Flyable 接口的对象存储在 Flyable 类型的切片中,通过遍历切片调用 Fly 方法。
func operateOnFlyables(flyables []Flyable) {
    for _, flyable := range flyables {
        flyable.Fly()
    }
}
  1. 两者都实现的对象:由于 Bird 结构体同时实现了 AnimalFlyable 接口,既可以放入 Animal 类型的切片调用 Speak 方法,也可以放入 Flyable 类型的切片调用 Fly 方法。
func main() {
    bird := Bird{}
    animals := []Animal{bird}
    flyables := []Flyable{bird}

    operateOnAnimals(animals)
    operateOnFlyables(flyables)
}

通过这种方式,利用接口类型的多态性,我们可以对不同类型(仅实现 Animal 或仅实现 Flyable 或两者都实现)的对象进行统一操作。