我正在尝试为类型参数设计模式实现指针方法示例的变体,以便抽象一些统一的存储库接口。我的印象是该Person结构将继承Entityif it composes的方法集*Entity,但我收到如下编译时错误。有人可以解释为什么不满足类型约束以及如何修复此代码吗?为糟糕的标题道歉;如果有人可以提出改进的摘要,那就太棒了(我对 Go 还很陌生)。谢谢 :)package main// domaintype PEntity[E any] interface { *E SetID(id string)}type Entity struct { ID string}func (e Entity) SetID(id string) { e.ID = id}type Repository[E Entity, PE PEntity[E]] interface { Get(id string) *E}// datatype Person struct { *Entity}type PersonRepository interface { Repository[Person, *Person] // -> Person does not implement Entity AddPet(name string) // ...}
1 回答
暮色呼如
TA贡献1853条经验 获得超9个赞
约束E Entity
——语法糖E interface{ Entity }
——有效地意味着类型集ofE
恰好包含一个类型 term Entity
,它是一个结构。
当你有确切的约束时,你只能用那个类型来满足它们,所以它与根本没有类型参数和声明常规函数参数没有太大区别。举个例子帮助你理解:
func Foo[T int](v T) {}
实际上与以下内容相同:
func Foo(v int) {}
E Entity
因此,您可以只使用 struct来满足约束Entity
。
显然Person
不是Entity
。字段嵌入只影响嵌入类型的方法集,与类型标识无关。
如果将约束更改为仅方法(基本)接口——或者Entity
直接更改(游乐场)——,那么它将只考虑方法集并成功编译:
type Repository[E interface{ SetID(id string) }, PE PEntity[E]] interface { Get(id string) *E }
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消