Golang 之 面向物件繼承(四)
阿新 • • 發佈:2018-11-12
並沒有為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 ()方法覆蓋了