使用隱藏方法實現介面
開發會計系統時,可能需要在主程式中隱藏介面的特定實作確保只有一個會計系統處於活動狀態。為了實現這一點,可以考慮將介面方法設為未匯出,並建立從本機適配器呼叫函數的匯出函數。
package accounting import "errors" type IAdapter interface { getInvoice() error } var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.getInvoice() }
但是,這種方法會遇到編譯錯誤,因為編譯器無法存取未匯出的 getInvoice會計系統套件中的方法。
cannot use adapter (type accountingsystem.Adapter) as type accounting.IAdapter in argument to accounting.SetAdapter: accountingsystem.Adapter does not implement accounting.IAdapter (missing accounting.getInvoice method) have accountingsystem.getInvoice() error want accounting.getInvoice() error
匿名結構體欄位方法
一個可能的解決方案是使用匿名結構體欄位。雖然這允許accountingsystem.Adapter滿足accounting.IAdapter接口,但它阻止使用者提供自己的未匯出方法的實作。
type Adapter struct { accounting.IAdapter }
替代方法
更慣用的方法是建立一個未匯出的適配器類型並提供一個向會計註冊適配器的函數
package accounting type IAdapter interface { GetInvoice() error } package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) }
透過這種方式,accountingsystem.adapter類型對主程式是隱藏的,並且可以透過呼叫SetupAdapter函數來初始化accounting系統。
以上是如何在Go中正確實作隱藏介面方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!