Go 中的介面方法重寫
與Java 不同,方法重寫涉及繼承和修改基底類別的實現,Go 提供了一種解決方案介面。
介面定義了類型必須實作的一組方法簽章。透過建立一個具有與所需行為相符的方法的接口,您可以用一種新類型來實現它,以代替原始類型。
要實現此目的,請考慮以下範例:
type Base struct{} func (base *Base) Get() string { return "base" } func (base *Base) GetName() string { return base.Get() }
要實現方法重寫,請建立一個介面:
type Getter interface { Get() string }
修改Base 類型以嵌入Getter 介面:
type Base struct { Getter }
現在,建立一個新類型嵌入Base 並實作Get方法:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
最後,修改Base 中的GetName 方法以利用Getter 介面:
func (base *Base) GetName() string { if g, ok := base.Getter.(Getter); ok { return g.Get() } else { return base.Get() } }
這種方法可以讓您保留Base 的現有消費者同時提供了在子類別中重寫Get 方法的能力。
或者,您也可以使用以下方法:
func New() *Sub { userType := &Sub{} userType.Getter = interface{}(userType).(Getter) return userType }
這種情況下,您必須手動設定 Getter 中的欄位用於啟用方法重寫的使用者程式碼。兩種方法都達到了預期的結果,但第一種方法在 Go 中被認為更慣用。
以上是Go中如何使用介面實作方法重寫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!