gpt4 book ai didi

go - 是否可以在另一个包中实现具有未导出方法的接口(interface)?

转载 作者:IT老高 更新时间:2023-10-28 13:10:16 25 4
gpt4 key购买 nike

我编写了一个用于会计系统访问的接口(interface)。我想从我的程序中隐藏接口(interface)的特定实现,因为我将永远只有一个“事件”会计系统。因此,我计划不导出(隐藏)接口(interface)的方法,然后将导出的函数导出到基础包中,从本地适配器调用相同的函数。

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()
}


__________________________________________________

package accountingsystem

type Adapter struct {}

func (a Adapter) getInvoice() error {return nil}


__________________________________________________


package main

import (
"accounting"
"accountingsystem"
)

function main() {
adapter := accountingsystem.Adapter{}
accounting.SetAdapter(adapter)
}

这个问题是编译器提示,由于无法看到 accountingsystem.AdaptergetInvoice() 的实现:

./main.go:2: 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

有没有办法在另一个包中实现一个带有未导出方法的接口(interface)?还是我以一种非惯用的方式思考这个问题?

最佳答案

您可以使用匿名结构字段实现带有未导出方法的接口(interface),但您不能提供自己的未导出方法的实现。比如这个版本的Adapter就满足accounting.IAdapter接口(interface)。

type Adapter struct {
accounting.IAdapter
}

我无法使用 Adapter 提供我自己的 IAdapter.getInvoice() 方法的实现。

这个技巧对你没有帮助。

如果不希望其他包直接使用accountingsystem.Adapter,则将该类型设为unexported,并添加一个用于将适配器注册到accounting包的函数。

package accounting

type IAdapter interface {
GetInvoice() error
}

---

package accountingsystem

type adapter struct {}

func (a adapter) GetInvoice() error {return nil}

func SetupAdapter() {
accounting.SetAdapter(adapter{})
}

---

package main

func main() {
accountingsystem.SetupAdapter()
}

关于go - 是否可以在另一个包中实现具有未导出方法的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com