2012-08-12 11 views
20

Hier ist mein Code implementieren:Wie Interface-Methode mit Rückgabetyp ist eine Schnittstelle in 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!" 
} 

Ich erhalte eine Fehlermeldung:

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 

Hier ist der vollständige Code: http://play.golang.org/p/udhsZgW3W2
I sollte bearbeiten die IA Schnittstelle oder modifi meine A struct?
Was ist, wenn ich IA, IB in einem anderen Paket (damit ich diese Schnittstelle teilen kann) definieren, muss ich mein Paket importieren und die IB als zurückgegebenen Typ von A.FB() verwenden, ist es richtig?

Antwort

15

Ändern Sie einfach

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

in

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

Sicher IB kann in einem anderen Paket definiert werden. Also, wenn beide Schnittstellen im Paket definiert sind foo und die Implementierungen sind in Paket bar, dann ist die Erklärung

type IA interface { 
    FB() IB 
} 

während der Umsetzung ist

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

Dies schließt nicht die Frage beantworten. Das Problem ist, dass wir die Schnittstellen in einer neuen Datei haben möchten, ohne die ursprüngliche Definition ändern zu können. – epsalon

+0

@epsalon Wie verhält sich Ihr Problem zu dem Original? Bitte beschreibe etwas mehr. – Mue

+2

Ich denke @ epsalon Frage ist ziemlich relevant. Angenommen, A und B sind in einem separaten Paket definiert, auf das nicht zugegriffen werden kann. Wie kann man die Schnittstellen IA und IB nachträglich definieren? Ein Beispiel dafür ist, wenn Sie versuchen, diese Schnittstellen zu definieren, um Mocks für A und B in einem komplett anderen Paket zu verwenden, ohne die ursprünglichen Dateien ändern zu können, in denen A und B deklariert sind. – ishaaq

Verwandte Themen