面试题答案
一键面试以下是用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")
}
对于如何利用多态性实现对不同类型对象的统一操作:
- 仅实现
Animal
接口的对象:可以将实现了Animal
接口的对象存储在Animal
类型的切片中,通过遍历切片调用Speak
方法。
func operateOnAnimals(animals []Animal) {
for _, animal := range animals {
animal.Speak()
}
}
- 仅实现
Flyable
接口的对象:可以将实现了Flyable
接口的对象存储在Flyable
类型的切片中,通过遍历切片调用Fly
方法。
func operateOnFlyables(flyables []Flyable) {
for _, flyable := range flyables {
flyable.Fly()
}
}
- 两者都实现的对象:由于
Bird
结构体同时实现了Animal
和Flyable
接口,既可以放入Animal
类型的切片调用Speak
方法,也可以放入Flyable
类型的切片调用Fly
方法。
func main() {
bird := Bird{}
animals := []Animal{bird}
flyables := []Flyable{bird}
operateOnAnimals(animals)
operateOnFlyables(flyables)
}
通过这种方式,利用接口类型的多态性,我们可以对不同类型(仅实现 Animal
或仅实现 Flyable
或两者都实现)的对象进行统一操作。