Как заставить метод интерфейса возвращать другой интерфейс? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть интерфейс с одним методом, который возвращает фрагмент другого интерфейса.Вот простое представление:

type Garage interface {
    AllCars() []Car
}

type Car interface {
    Name() string
}

Я также сделал реализацию для этого:

type MyGarage struct{}

func (g MyGarage) AllCars() []MyCar {
    return make([]MyCar, 0)
}

type MyCar struct {
    name string
}

func (c MyCar) Name() string {
    return c.name
}

Теперь в моем тесте я сделал функцию:

func TestAllCars(t *testing.T) {
    var garage Garage
    garage = new(mygarage.MyGarage)
    cars := garage.AllCars()
    fmt.Println(cars)
}

И Go жалуется, что MyGarage не реализует интерфейс Garage, что я понимаю, но не ожидал, потому что MyCar реализует Car, поэтому это не должно было быть проблемой для меня.

cannot use new(mygarage.MyGarage) (type *mygarage.MyGarage) as type Garage in assignment:
    *mygarage.MyGarage does not implement Garage (wrong type for AllCars method)
        have AllCars() []mygarage.MyCar
        want AllCars() []Car

Чтоя делаю что-то не так?

Редактировать после комментариев

Я попытался изменить метод на возврат только одной машины, чтобы избежать проблем со срезами интерфейсов, но он все еще жалуется.Просто ради того, чтобы я хотел понять, что происходит.Поскольку MyCar реализует Car, я не ожидал следующей ошибки:

*mygarage.MyGarage does not implement Garage (wrong type for GetCar method)
    have GetCar() mygarage.MyCar
    want GetCar() Car

Я считаю, что проблема заключается в типизированном типе возврата, MyCar не является автомобилем, но должна быть возможность разыгратьэто одно, но Go не принимает это в качестве действительной реализации для интерфейса Garage?

1 Ответ

0 голосов
/ 27 сентября 2019

Это связано с тем, что кусочки интерфейса не являются интерфейсами, поэтому я думаю, что ниже дано то, что вы хотите.

https://play.golang.org/p/qg0NQNCIjx7

type Garage interface {
    AllCars() []Car
}

type Car interface {
    Name() string
}

type MyGarage struct{

}

func (g MyGarage) AllCars() []Car {
    x := []Car{MyCar{}}
    return x
}

type MyCar struct {
    name string
}

func (c MyCar) Name() string {
    return c.name
}

func main() {
    var garage Garage
    garage = MyGarage{}
    cars := garage.AllCars()
    fmt.Println(cars)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...