在Go中实现Struct抽象的正确方法是什么?

时间:2017-11-13 11:01:49

标签: inheritance go

我在理解Go的结构继承方面遇到了一些问题。我试图对某个对象类型做一些抽象。请参阅以下示例代码:

package main

type Animal struct{}
type Dog struct {
    Animal
    Color string
}

type Person struct {
    Name string
    Age  int
    Pet  *Animal
}

func main() {
    dog := &Dog{Color: "brown"}
    tom := &Person{Name: "Tom", Age: 13, Pet: dog}
}

这导致编译错误:

  

不能使用dog(type * Dog)作为类型* Animal in field value

这样做抽象的正确方法是什么? Go中有可能吗?

示例的最终目标是拥有不同类型的宠物 - 狗,猫,哈泽等。然后能够将其存储到期望类型为Animal的结构中。

要想象,例如:

type Person struct {
    Name string
    Age  int
    Pet  *Dog OR *Cat OR *Hamster
}

Go Playground Link

2 个答案:

答案 0 :(得分:1)

两个工作样本:

1-尝试this

package main

import (
    "fmt"
)

type Animal interface {
    color() string
}
type Dog struct {
    Color string
}

func (d Dog) color() string {
    return d.Color
}

type Person struct {
    Name string
    Age  int
    Pet  Animal
}

func main() {
    dog := &Dog{Color: "brown"}
    tom := &Person{Name: "Tom", Age: 13, Pet: dog}
    fmt.Println(tom.Pet.color())
}

2-尝试this

package main

import (
    "fmt"
)

type Animal struct{}
type Dog struct {
    Animal
    Color string
}

type Person struct {
    Name string
    Age  int
    Pet  interface{}
}

func main() {
    dog := &Dog{Color: "brown"}
    tom := &Person{Name: "Tom", Age: 13, Pet: dog}
    fmt.Println(tom.Name)
}

答案 1 :(得分:0)

只是为了添加接受的答案,接口或嵌入的使用并不是真正的要求,至少在这个简单的例子中不是。

例如,如果您有一组具有相同结构但没有任何方法的类型,即没有行为的纯数据,在这种情况下,您可以使用单一类型来表示集合和另外的“枚举” “代表”善良“。

例如:

type AnimalKind string

const (
    AnimalKindDog AnimalKind = "dog"
    AnimalKindCat AnimalKind = "cat"
)

type Animal struct {
    Kind  AnimalKind
    Color string
}

// ...

dog := &Animal{Kind: AnimalKindDog, Color: "brown"}
tom := &Person{Name: "Tom", Age: 13, Pet: dog}