雖然Go語言並不是如Java的物件導向語言,沒有明顯的繼承關係,但仍可以利用介面(interface)和,嵌入欄位(embedded field)來達成類似覆寫(override)的效果。
例如下面有個基底struct Base
,其實現Valuer
介面的GetValue()
;而Ext
將Base
作為嵌入欄位,一樣實現Valuer
介面的GetValue()
。則呼叫Ext.GetValue()
時,是執行Ext
本身的GetValue()
邏輯,這樣就達到類似覆寫的效果。
main.go
package main
import (
"fmt"
_ "net/http/pprof"
)
func main() {
base := Base{1}
fmt.Println(base.GetValue()) // 1
ext := Ext{base}
fmt.Println(ext.GetValue()) // 2
valuers := []Valuer{base, ext}
for _, valuer := range valuers {
fmt.Println(valuer.GetValue())
}
}
type Base struct {
value int
}
type Valuer interface {
GetValue() int
}
func (b Base) GetValue() int {
return b.value
}
type Ext struct {
Base
}
func (e Ext) GetValue() int {
return e.value + 1
}
以上執行結果:
1
2
1
2
或是把Ext
的GetValue()
方法刪除,那麼呼叫Ext.GetValue()
時實際上是調用其嵌入欄位Base
的GetValue()
,所以執行結果如下。
1
1
1
1
沒有留言:
張貼留言