在 Go 中,沒有與物件導向語言(如 Java)中的方法重寫直接等效的方法。但是,還有其他方法可以實現類似的功能。
考慮這樣的場景:您有一個基底類型 Base,其方法 Get() 傳回字串「base」。您想要定義一個繼承自 Base 的新類型 Sub,但具有傳回「Sub」的 Get() 的不同實作。
您最初嘗試使用組合,如下所示:
type Sub struct { Base } func(sub *Sub) Get() string { return "Sub" }
將不起作用,因為 Sub 的 Get() 方法無法覆寫 Base 的 Get() 方法。這是由於 Go 的方法接收器語義,其中接收器類型(在本例中為 *Base)決定要呼叫的方法。
另一種方法是使用介面。介面定義了型別必須實作的方法契約,類似於 Java 的抽象類別。在這種情況下,您可以使用單一 Get() 方法定義一個介面 Getter。
type Getter interface { Get() string }
然後您可以修改Base 來實作Getter 介面:
type Base struct { } func (base *Base) Get() string { return "base" }
現在,您可以將Sub 定義為嵌入Base 實例並實作Getter 的結構體:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
然後你可以使用GetName() 方法動態決定呼叫Get()的哪個實作:
func (base *Base) GetName(getter Getter) string { if g, ok := getter.(Getter); ok { return g.Get() } else { return base.Get() } }
在main 函數中,您可以建立Sub 的實例,將其轉換為Getter,然後將其傳遞給GetName( ):
userType := Sub{} fmt.Println(userType.GetName()) // prints "Sub"
另一個選擇是使用方法嵌入。這允許您透過嵌入實現該方法的類型來將方法新增至結構。在這種情況下,您可以定義一個新類型SubGetter,它嵌入Base 並實現新的Get() 方法:
type SubGetter struct { Base } func (sub *SubGetter) Get() string { return "Sub" }
然後您可以使用SubGetter 作為Base 的方法:
type Base struct { SubGetter }
這允許您呼叫SubGetter 的Get() 方法,就好像它是Base的方法一樣:
base := Base{} fmt.Println(base.Get()) // prints "Sub"
以上是Go中如何實作方法重寫功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!