面试题答案
一键面试接口实现和使用上的区别
Dog
结构体通过嵌入Mammal
实现Animal
接口- 实现方式:通过结构体嵌入,
Dog
结构体隐式地获得了Mammal
实现的Animal
接口方法。这是一种组合的方式,代码结构上Dog
结构体依赖于Mammal
结构体的实现。 - 使用特点:如果
Mammal
对Animal
接口方法有更新,Dog
结构体无需额外修改就自动拥有这些更新。但如果Dog
结构体需要对Speak
方法有特殊实现,需要在Dog
结构体中重新定义Speak
方法来覆盖Mammal
的实现。
- 实现方式:通过结构体嵌入,
Cat
结构体直接实现Animal
接口- 实现方式:
Cat
结构体直接定义Speak
方法,明确地实现Animal
接口。这种方式更加直接,Cat
结构体对接口实现有完全的控制权。 - 使用特点:
Cat
结构体的Speak
方法实现独立于其他结构体。如果需要修改Cat
的Speak
方法,不会影响到其他实现Animal
接口的结构体。
- 实现方式:
代码示例(以Go语言为例)
package main
import "fmt"
// Animal 接口
type Animal interface {
Speak() string
}
// Mammal 结构体实现 Animal 接口
type Mammal struct{}
func (m Mammal) Speak() string {
return "Generic mammal sound"
}
// Dog 结构体嵌入 Mammal 结构体
type Dog struct {
Mammal
}
// Cat 结构体直接实现 Animal 接口
type Cat struct{}
func (c Cat) Speak() string {
return "Meow"
}
func main() {
var a Animal
dog := Dog{}
cat := Cat{}
a = dog
fmt.Println(a.Speak())
a = cat
fmt.Println(a.Speak())
}
在上述代码中,Dog
通过嵌入 Mammal
间接实现 Animal
接口,Cat
直接实现 Animal
接口。在 main
函数中,可以看到通过接口类型变量 a
调用 Speak
方法时,分别执行了 Dog
和 Cat
对应的 Speak
方法实现。