使用隐藏方法实现接口
开发会计系统时,可能需要在主程序中隐藏接口的特定实现确保只有一个会计系统处于活动状态。为了实现这一点,可以考虑将接口方法设为未导出,并创建从本地适配器调用函数的导出函数。
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中文网其他相关文章!