2012-08-12 5 views
20

Oto mój kod:Jak wdrożyć metody interfejsu z zwracany typ jest interfejs w 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!" 
} 

pojawia się błąd:

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 

Oto pełny kod: http://play.golang.org/p/udhsZgW3W2
I powinien edytować interfejs I modifi my A?
Co się stanie, jeśli zdefiniuję IA, IB w innym pakiecie (dzięki czemu mogę udostępnić ten interfejs), muszę zaimportować pakiet i użyć IB jako zwróconego typu A.FB(), czy to prawda?

Odpowiedz

15

Wystarczy zmienić

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

do

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

pewnością IB może być zdefiniowana w innym opakowaniu. Więc jeśli oba interfejsy są zdefiniowane w pakiecie foo i implementacje są w opakowaniu bar, wówczas deklaracja jest

type IA interface { 
    FB() IB 
} 

natomiast realizacja jest

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

To nie jest odpowiedź na pytanie. Problem polega na tym, że chcielibyśmy mieć interfejsy w nowym pliku bez możliwości zmiany pierwotnej definicji. – epsalon

+0

@epsalon Jak twój problem dotyczy oryginalnego? Opisz nieco więcej. – Mue

+2

Myślę, że pytanie @ epsalon jest całkiem trafne. Zakładając, że zarówno A, jak i B są zdefiniowane w pakiecie, który jest oddzielny i niedostępny. Jak można retrospektywnie zdefiniować interfejsy IA i IB? Przykładem tego, kiedy chcesz tego dokonać, jest próba zdefiniowania tych interfejsów w celu użycia makiet dla A i B w zupełnie innym pakiecie, bez możliwości modyfikacji oryginalnych plików, w których deklarowane są A i B. – ishaaq

Powiązane problemy