在继承的结构上使用链方法

时间:2018-11-06 15:48:18

标签: go

我是新手。我正在解决一个与此相似的问题,我有一个从动物结构继承的结构狗。我想链接方法,以便获得“我是动物。但是当我运行程序时,它会产生一个错误

  

dog.Animal.Hello()。Bark未定义(类型* Animal没有字段或方法Bark)

type Animal struct {
    name string
    age int
}

func (animal *Animal) Hello() *Animal {
    fmt.Println("I am an animal")
    return animal
}

type Dog struct {
    *Animal
}

func (dog *Dog) Bark() *Dog {
    fmt.Println("woof!")
    return dog
}

func main() {
    dog := &Dog{&Animal{name: "Peter", age: 25}}
    dog.Hello().Bark()
}

我该如何克服。谢谢你的建议

1 个答案:

答案 0 :(得分:1)

dog.Hello()返回一个*Animal,而不是*Dog,因此您不能只对返回的值调用.Bark()

请注意,调用dog.Hello()并不是真正对Hello()结构的Dog调用*Animal,而是对其中包含的dog.animal.Hello()的调用。它只是语法糖,等效于*Animal(如果*Dog字段是命名的,而不是匿名的)。这不是继承!

但是,您已经有一个.Bark(),因此您可以直接致电dog.Hello() dog.Bark()

cvtColor( image, gray_image, CV_BGR2GRAY );

关于接口的注释中的建议也可能适用,但是对于这个玩具示例,很难一开始就说出您要实现的目标。