我在理解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
}
答案 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}