我正在將一些代碼從C++移植到golang。我對golang中的OOP和多態性做了一些研究,都建議使用接口和嵌入來實現多態性。我有一個示例代碼,如下所示type Worker interface { Show() Inc()}type WorkerA struct { x int Worker // embed all methods in interface}type WorkerB struct { WorkerA // embed WorkerA to have all methods}func (a *WorkerA) Inc() { a.x++}func (a WorkerA) Show() { fmt.Println("A:", a.x)}func (b WorkerB) Show() { fmt.Println("B:", b.x)}func main() { list := make([]Worker, 10) for n:=0; n<len(list); n++ { if n%2==0 { list[n] = &WorkerA{} } else { list[n] = &WorkerB{WorkerA{}} } } list[0].Inc() list[1].Inc() list[1].Inc() list[2].Inc() list[2].Inc() list[2].Inc() list[0].Show() list[1].Show() list[2].Show()在接口數組的幫助下,我可以在兩個 Worker 之間調用相應的方法和 'WorkerBAddx'''ShowWorkerA. Now I would like to add a third method call which add thefunc (a *WorkerA) Add(b WorkerA) { a.x += b.x}我發現調用以下內容會導致錯誤之前是持有接口而不是結構listlist[0].Add(list[2])我在網上查找一些想法,看看可能有助于解決問題,這是我寫的reflectfunc callMethodParam(p interface{}, q interface{}) { o := reflect.ValueOf(p) m := reflect.ValueOf(q) args:=[]reflect.Value{reflect.ValueOf(m)} o.MethodByName("Add").Call(args)}callMethodParam(list[0], list[2])但這似乎也行不通。任何想法如何使它工作?謝謝。
1 回答

慕的地8271018
TA貢獻1796條經驗 獲得超4個贊
你問題的標題聽起來像是一個XY問題,但幸運的是,我們知道X,是嗎?
此外,代碼無法像示例中顯示的那樣工作,因為代碼被聲明為 切片并且沒有方法。list[0].Add(list[2])listWorkerWorkerAdd
但讓我們假裝它確實如此。鑒于 的實現需要訪問 一個 字段,您可以更改簽名以接受提供 的接口,并實現該接口:Add(b WorkerA)WorkerAxxWorkerA
type XProvider interface {
X() int
}
func (a *WorkerA) X() int {
return a.x
}
func (a *WorkerA) Add(b XProvider) {
a.x += b.X()
}
然后在調用之前,使用類型斷言來確保(其中包含的類型)的特定實例也實現:a.AddWorkerXProvider
if xp, ok := list[2].(XProvider); ok {
list[0].Add(xp)
}
這是一個更新的游樂場
- 1 回答
- 0 關注
- 99 瀏覽
添加回答
舉報
0/150
提交
取消