Ответы пользователя по тегу Go
  • Почему в golang — встраивание это не наследование?

    @s_kozlov
    Встраивание суть композиция. Это другой тип отношений, отличный от наследования или агрегации.
    Хорошо описано по этой ссылке

    Если в Go захочется агрегацию - используем поля-указатели на структуры, если композицию - встраивание. Таким образом управляем "жесткостью" связи и временем жизни структур.
    Если необходим полиморфизм поведения в рантайме - используем поля-интерфейсы, в которые инстанцируем потребные структуры во время выполнения.
    Ответ написан
    Комментировать
  • Как "наследовать метод" golang?

    @s_kozlov
    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
    Ответ написан
    Комментировать