Сделал простой код из двух структур:
package main
import "fmt"
type Animal struct {
Name string
}
type Rabbit struct {
Animal
}
//Метод Walk у каждого свой
func (this *Animal) Walk() *Animal{
fmt.Println("I walk", this.Name)
return this
}
//Метод Say один
func (this *Animal) Say() *Animal{
fmt.Println("Im Animal and my Name is", this.Name)
return this
}
//Метод Walk изменяется для Rabbit и работает корректно
func (this *Rabbit) Walk() *Rabbit{
this.Animal.Walk()
fmt.Println("...and Jump")
return this
}
func main() {
animal := Animal{ Name: "Зверь" }
animal.Walk().Say().Walk()
fmt.Println("\n---------------------\n")
rabbit := Rabbit{ }
rabbit.Name = "Кроль"
rabbit.Walk().Say().Walk() // Say возвращает ссылку на Animal, поэтому второй вызов Walk срабатывает от Animal (без jump) - как сделать правильно?
}
запустить можно тут:
play.golang.org/p/RricqVcYx7
Проблема в том, что при чейнинге (rabbit) после "родительского" метода Say, который возвращает указатель на Animal, следующий метод вызывается уже для Animal, а не Rabbit. Понимаю, что в GO нету наследования, но не понимаю, как решать типичные задачи.
Копипастить каждый раз свой метод с возвращением нужного указателя заного? Вообще избегать наследования?
Или как то по другому это делается?
Покажите пожалуйста, как в стиле GO.