2012-08-12 17 views
20

Ecco il mio codice:Come implementare metodo di interfaccia con il tipo restituito è un'interfaccia 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!" 
} 

ottengo un errore:

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 

Ecco il codice completo: http://play.golang.org/p/udhsZgW3W2
I modificare l'interfaccia IA o modificare la mia struttura A?
Cosa succede se definisco IA, IB in un altro pacchetto (quindi posso condividere questa interfaccia), devo importare il mio pacchetto e usare l'IB come tipo restituito di A.FB(), è giusto?

risposta

15

Basta cambiare

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

in

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

Sicuramente IB può essere definito in un altro pacchetto. Quindi, se entrambe le interfacce sono definite nel pacchetto foo e le implementazioni sono in confezione bar, allora la dichiarazione è

type IA interface { 
    FB() IB 
} 

mentre l'implementazione è

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

questo non risponde alla domanda. Il problema è che vorremmo avere le interfacce in un nuovo file senza poter modificare la definizione originale. – epsalon

+0

@epsalon In che modo il tuo problema si riferisce a quello originale? Si prega di descrivere un po 'di più. – Mue

+2

Penso che la domanda di @ epsalon sia abbastanza pertinente. Supponendo che A e B siano definiti in un pacchetto separato e inaccessibile. Come si possono definire le interfacce IA e IB in modo retrospettivo? Un esempio di quando si potrebbe voler fare questo è se si sta tentando di definire queste interfacce al fine di utilizzare mock per entrambi A e B in un pacchetto completamente diverso senza essere in grado di modificare i file originali dove vengono dichiarati A e B. – ishaaq

Problemi correlati