2012-08-12 60 views
20

這裏的接口是我的代碼:如何實現與返回類型接口的方法是在Golang

type IA interface { 
    FB() IB 
} 

type IB interface { 
    Bar() string 
} 

type A struct { 
    b *B 
} 

func (a *A) FB() *B { 
    return a.b 
} 

type B struct{} 

func (b *B) Bar() string { 
    return "Bar!" 
} 

我得到一個錯誤:

cannot use a (type *A) as type IA in function argument: 
    *A does not implement IA (wrong type for FB method) 
     have FB() *B 
     want FB() IB 

下面是完整的代碼:http://play.golang.org/p/udhsZgW3W2
我應該編輯IA接口或修改我的A結構?
如果我在其他包中定義IA,IB(所以我可以共享這些接口),我必須導入我的包並使用IB作爲A.FB()的返回類型,是不是?

回答

15

只要改變

func (a *A) FB() *B { 
    return a.b 
} 

func (a *A) FB() IB { 
    return a.b 
} 

當然IB可以在另一個包來定義。所以,如果這兩個接口在包foo定義和實現在包bar,那麼聲明

type IA interface { 
    FB() IB 
} 

而實現

func (a *A) FB() foo.IB { 
    return a.b 
} 
+0

這不回答這個問題。問題在於我們希望將接口放在新文件中而不能更改原始定義。 – epsalon 2017-01-26 00:13:58

+0

@epsalon你的問題與原來的問題有什麼關係?請多描述一下。 – Mue 2017-01-26 05:56:29

+2

我認爲@ epsalon的問題是相當中肯的。假設A和B都在單獨且無法訪問的包中定義。如何回顧性地定義接口IA和IB?你可能想要這樣做的一個例子是,如果你試圖定義這些接口,以便在完全不同的包中爲A和B使用mock而不能修改聲明A和B的原始文件。 – ishaaq 2017-04-24 19:28:39

相關問題