Есть ли способ вернуть реализацию структуры вместо интерфейса в Go? - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу построить систему, которая может быть расширена для различных приложений системы.

В пакете домена у меня есть следующий интерфейс:

package main

type CardInterface interface {
 GetName()string
}

type DeckInterface interface {
 GetCards()[]CardInterface
}

и в В пакете приложения у меня есть следующие реализации:

package implementation
//Implementing CardInterface
type Card struct {
  Name string
}

func (c Card) GetName() string {
  return c.Name
}


type Deck struct {
  Cards []Card
}


func (d Deck) GetCards() []CardInterface {
  return d.Cards[]
}

Но выдает ошибку, говорящую, что не может вернуть экземпляр []Card вместо []CardInterface.

Есть ли способ реализовать такую ​​структуру OOP в Go? Если нет, то как я могу достичь такого рода расширений?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Если вы хотите сохранить определение типа Deck (если нет, ознакомьтесь с ответом Shadowchaser ), вы можете попробовать что-то вроде этого:

func (d Deck) GetCards() []CardInterface {
  var res []CardInterface
  for _ , card := range d.Cards {
    res = append(res, card)
  }
  return res
}

Вам необходимо переопределить Deck, поскольку, хотя Card является CardInterface, []Card не является []CardInterface.

1 голос
/ 19 апреля 2020

Вам нужно изменить свою колоду следующим образом:

type Deck struct {
    Cards []CardInterface
}

Вам также не нужно [] здесь:

func (d Deck) GetCards() []CardInterface {
    return d.Cards
}

Вам, конечно, понадобится утверждение типа для Карта доступа в массиве Cards, вот пример того, как она может работать https://play.golang.org/p/PPofF2u-H3S.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...