package main
import "fmt"
type AnimalIntf interface {
Walk() AnimalIntf
Say() AnimalIntf
}
type Animal struct {
animal AnimalIntf
Name string
}
type Rabbit struct {
Animal
}
// Animal
func NewAnimal(name string) *Animal {
animal := new(Animal)
animal.animal = animal
animal.Name = name
return animal
}
//Метод Walk у каждого свой
func (this *Animal) Walk() AnimalIntf {
fmt.Println("I walk", this.Name)
return this.animal
}
//Метод Say общий
func (this *Animal) Say() AnimalIntf {
fmt.Println("Im Animal and my Name is", this.Name)
return this.animal
}
// Rabbit
func NewRabbit(name string) *Rabbit {
rabbit := new(Rabbit)
rabbit.animal = rabbit
rabbit.Name = name
return rabbit
}
//Метод Walk изменяется для Rabbit и работает корректно
func (this *Rabbit) Walk() AnimalIntf {
this.Animal.Walk()
fmt.Println("...and Jump")
return this.animal
}
func main() {
animal := NewAnimal("Зверь")
animal.Walk().Say().Walk()
fmt.Println("\n---------------------\n")
rabbit := NewRabbit("Кроль")
rabbit.Walk().Say().Walk()
}
примерно так, как вариант
вывод:
I walk Зверь
Im Animal and my Name is Зверь
I walk Зверь
---------------------
I walk Кроль
...and Jump
Im Animal and my Name is Кроль
I walk Кроль
...and Jump