Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Классу дрессировщик не нужно знать особенности реализации выполнения команд классами животных...
func (t *Tamer) Command(action int, a Animal) string {
switch action {
case ActSit:
// Подойти к питомцу
// Стать к нему лицом и наклонится
// Показать питомцу лакомство
return a.Sit() // Произнести команду сидеть
}
return ""
}
func (d Dog) Sit() string {
// Посмотреть на дрессировщика
// Выпрямить передние лапы
// Согнуть задние лапы
// Повилять хвостом
return "sit"
}
Смотрите, на самом деле дресссировщик не знает особенности того как команда выполняется животным.
эта проверка как раз могла бы быть проведена во время проверки интерфейса и один раз.
func (t *Tamer) Command(action int, a Animal) string {
if !a.IsTrained() {
t.train(a, action)
}
...
}
type TamedAnimal interface {
Speaker
Do(command int) string
}
type Tamer struct{}
func (t *Tamer) Speaks() string { return "WAT?" }
func (t *Tamer) Command(action int, a TamedAnimal) string {
return a.Do(action)
}
func (t *Tamer) Praise(a Speaker) string {
return a.Speaks()
}
Интерфейсы как абстрактные типы данных в Go