網頁

2023/8/21

Golang 如何實現覆寫方法

雖然Go語言並不是如Java的物件導向語言,沒有明顯的繼承關係,但仍可以利用介面(interface)和,嵌入欄位(embedded field)來達成類似覆寫(override)的效果。


例如下面有個基底struct Base,其實現Valuer介面的GetValue();而ExtBase作為嵌入欄位,一樣實現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

或是把ExtGetValue()方法刪除,那麼呼叫Ext.GetValue()時實際上是調用其嵌入欄位BaseGetValue(),所以執行結果如下。

1
1
1
1

沒有留言:

張貼留言