Go 方法重寫:實作類似繼承的行為
Go 中不直接支援傳統物件導向程式設計意義上的方法重寫。然而,有一些技術可以實現類似的功能。人們可以利用介面和匿名嵌入結構來模擬方法重寫行為。
理解問題
考慮以下程式碼片段,其中我們使用 Get 定義基底類型 Base () 方法和一個僅傳回 Get() 結果的 GetName() 方法。
type Base struct { } func (base *Base) Get() string { return "base" } func (base *Base) GetName() string { return base.Get() }
目標是建立一個新類型,覆寫 Get() 實現,同時保留現有基本類型的功能。
使用匿名嵌入
模擬方法重寫的一種方法是使用匿名嵌入。定義一個嵌入 Base 類型的新類型:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
此方法不起作用,因為匿名嵌入本質上是嵌入的 Base 類型的副本,而新的 Get() 方法定義在單獨的複製。
利用介面和嵌入
更慣用的 Go實作類別繼承行為的方法是使用介面和嵌入。以下是我們如何實現這一點:
type Getter interface { Get() string }
type Base struct { Getter } func (base *Base) Get() string { return "base" }
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
func (sub *Sub) GetName() string { return sub.Base.GetName(sub) }
透過利用這種方法,Sub 類型可以重寫Get() 方法,同時仍保留Base類型的完整功能。重寫的方法可以透過 Getter 介面明確調用,確保根據接收者類型正確調度方法。
以上是如果沒有直接支持,如何在 Go 中模擬方法重寫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!