Go 中的介面支援多態性,讓您可以建立可以與實作這些介面的任何類型一起使用的泛型類型。然而,與 Java 或 C 等語言不同,Go 不支援多重繼承。這就提出瞭如何實現某些設計模式的問題,例如使用「應該實現」兩個介面的類型,而不需要繼承。
隱藏您的結構類型並表示它作為一個介面:
type Card interface { GetFace() string GetSuit() string }
您也想為您的Card 介面定義一個String() 方法,但這提出了一個挑戰,因為您無法將介面傳遞給String() 方法的實作。
不要使用隱藏結構體並僅導出介面的反模式,請考慮以下方法:
隱藏結構體欄位以防止外部修改,但導出指向它:
type Card struct { // ... struct fields here } func NewCard(...) *Card { // ... }
為指向Card 結構的指標定義String() 方法:
func (c *Card) String() string { // ... }
這種方法允許您:
雖然「介面隱藏」模式看起來很吸引人,但它可能會導致封裝不良、損壞文件並引入不必要的複雜性。建議的導出結構體指標並在指標類型上實作 String() 方法的方法提供了更乾淨、更有效的解決方案。
以上是如何在沒有多重繼承的情況下有效實作Go介面的方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!