Допустим есть структура
Repository которая хранит в себе другие структуры с методами для работы с DB (в примере ниже - Subrepo). Чтобы избежать жесткой связи с конкретной реализацией Repository, я предполагаю что нужно использовать интерфейсы.
Но никак не могу решить проблему, когда интерфейс содержит метод который возвращает другой интерфейс.
import "fmt"
//import repository
type RepositoryInterface interface {
GetSubrepo() SubrepoInterface // << Не работает
// GetSubrepo() Subrepo // << Работает
}
type SubrepoInterface interface {
HelloSubrepo()
}
func main() {
r := Repository{subrepo: Subrepo{}}
useRepository(r)
}
// func touchRepository(c Repository) {
func useRepository(r RepositoryInterface) {
sr := r.GetSubrepo()
sr.HelloSubrepo()
}
// ******************** Repository package ****************
type Repository struct {
subrepo Subrepo
}
func (r *Repository) GetSubrepo() Subrepo {
return r.subrepo
}
type Subrepo struct {
}
func (sr *Subrepo) HelloSubrepo() {
fmt.Printf("hello subrepo\n")
}
Ошибка:
./prog.go:18:16: cannot use r (variable of type Repository) as RepositoryInterface value in argument to useRepository: Repository does not implement RepositoryInterface (wrong type for method GetSubrepo)
have GetSubrepo() Subrepo
want GetSubrepo() SubrepoInterface
Подскажите, как правильно решить такую задачу, сохранив слабую связанность через интерфейсы.