Как на Subtype можно ссылаться по Supertype в Go - PullRequest
0 голосов
/ 20 сентября 2019

Go не поддерживает полиморфизм. Если определенные типы должны были передаваться под эгидой универсальных типов, он не работает в Go.Следующий фрагмент кода выдает ошибку.Каков наилучший способ достижения той же функциональности в Go?

package main

import (
"fmt"
)

type parent struct {
    parentID string
}

type child1 struct {
    parent
    child1ID string
}

type child2 struct {
    parent
    child2ID string
}

type childCollection struct {
    collection []parent
}

func (c *childCollection) appendChild(p parent) {
    c.collection = append(c.collection, p)
}

func main() {

    c1 := new(child1)
    c2 := new(child2)

    c := new(childCollection)
    c.appendChild(c1)
    c.appendChild(c2)

}

Go Playground Link

1 Ответ

1 голос
/ 20 сентября 2019

Просто потому, что в этом случае тип Child состоит из чего-то Parent.не значит что это что то.Это два разных типа, поэтому они не могут быть взаимозаменяемы таким образом.

Теперь, если у вас есть интерфейс Parent и ваши дочерние объекты встречают этот интерфейс, тогда мы говорим совсем о другом.

Редактировать 1

Пример

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

Редактировать 2

package main

import "fmt"


type parent interface {
    getParentId() (string)
}

type child1 struct {
    child1ID string
}

func (c child1) getParentId() (string) {
    return c.child1ID
}

type child2 struct {
    child2ID string
}

func (c child2) getParentId() (string) {
    return c.child2ID
}

type childCollection struct {
    collection []parent
}

func (c *childCollection) appendChild(p parent) {
    c.collection = append(c.collection, p)
}

func main() {

    c1 := child1{"1"}
    c2 := child2{"2"}

    c := new(childCollection)
    c.appendChild(c1)
    c.appendChild(c2)

    fmt.Println(c)

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