我正在嘗試為型別引數設計模式實作指標方法示例的變體,以便在一些統一的存盤庫介面上進行抽象。
我的印象是該Person結構將繼承Entityif it composes的方法集*Entity,但我得到一個編譯時錯誤,如下所示。有人可以解釋為什么不滿足型別約束以及如何修復此代碼嗎?
為糟糕的標題道歉;如果有人可以提出一個很棒的改進摘要(我對 Go 很陌生)。
謝謝 :)
package main
// domain
type 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
}
// data
type Person struct {
*Entity
}
type PersonRepository interface {
Repository[Person, *Person] // -> Person does not implement Entity
AddPet(name string)
// ...
}
uj5u.com熱心網友回復:
約束E Entity——語法糖E interface{ Entity }——實際上意味著型別集只E包含一個型別 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
}
有關基本與非基本介面的更多資訊:介面包含型別約束:不能在轉換中使用介面
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494545.html
上一篇:函式指標的轉換
下一篇:所有號碼的介面?[復制]
