并没有为PhonePlus 实现接口,仅仅为Phone实现了接口,不过PhonePlus里面嵌入了Phone的一个内部类型,也是可以通过接口调用函数Call来调用到Communicate method。
在main函数,发现PhonePlus的methods set 里面包含了Communicate()
package main
import "fmt"
type Phone struct {
OS string
Net string
}
type PhonePlus struct {
Phone
Plus string
}
type PhoneFunction interface {
Communicate()
Online()
}
func Call(OnePhone PhoneFunction) {
OnePhone.Communicate()
}
func QQ(OnePhone PhoneFunction) {
OnePhone.Online()
}
func (p Phone) Communicate() {
fmt.Printf("...呼叫中 \n")
}
func (p Phone) Online() {
fmt.Printf("...上网中 \n")
}
func main() {
p := &PhonePlus{Phone{"ios", "5G"},"5.0"}
fmt.Printf("%+v ", p)
Call(p)
QQ(p)
fmt.Printf("%+v ", p.Phone)
Call(p.Phone)
QQ(p.Phone)
}
嵌入类型的类型中,外部类型自己未曾实现的methods被携带的内部函数实现时,外部类型也会将这些methods加入到自己的methods set里。
那么,如果外部类型PhonePlus 自己实现了Communicate()函数(同时也实现了接口),内部和外部都实现的情况下会怎样呢?
- 发现PhonePlus 的使用了自己实现的方法,或者说它把内部Cat的Phone ()方法覆盖了