我试图通过更好地定义接口和使用嵌入式结构来重用功能来清理我的代码库。就我而言,我有许多可以链接到各种对象的实体类型。我想定义捕获需求的接口和实现接口的结构,然后可以将其嵌入到实体中。
// All entities implement this interface
type Entity interface {
Identifier()
Type()
}
// Interface for entities that can link Foos
type FooLinker interface {
LinkFoo()
}
type FooLinkerEntity struct {
Foo []*Foo
}
func (f *FooLinkerEntity) LinkFoo() {
// Issue: Need to access Identifier() and Type() here
// but FooLinkerEntity doesn't implement Entity
}
// Interface for entities that can link Bars
type BarLinker interface {
LinkBar()
}
type BarLinkerEntity struct {
Bar []*Bar
}
func (b *BarLinkerEntity) LinkBar() {
// Issues: Need to access Identifier() and Type() here
// but BarLinkerEntity doesn't implement Entity
}
所以我的第一个想法是让 FooLinkerEntity 和 BarLinkerEntity 只实现实体接口。
// Implementation of Entity interface
type EntityModel struct {
Id string
Object string
}
func (e *EntityModel) Identifier() { return e.Id }
func (e *EntityModel) Type() { return e.Type }
type FooLinkerEntity struct {
EntityModel
Foo []*Foo
}
type BarLinkerEntity struct {
EntityModel
Bar []*Bar
}
但是,对于可以链接 Foos 和 Bars 的任何类型,这最终都会导致歧义错误。
// Baz.Identifier() is ambiguous between EntityModel, FooLinkerEntity,
// and BarLinkerEntity.
type Baz struct {
EntityModel
FooLinkerEntity
BarLinkerEntity
}
构建此类代码的正确 Go 方法是什么?我是否只是在LinkFoo()and 中LinkBar()进行类型断言以到达Identifier()and Type()?有什么方法可以在编译时而不是运行时进行此检查吗?
慕哥9229398
繁星coding
相关分类