Несколько интерфейсов в Go
Один тип может подходить сразу под несколько интерфейсов. У каждого интерфейса свой список методов, и тип должен закрыть каждый список отдельно. Лишние методы у типа не мешают: важно только наличие нужных имен и сигнатур.
Объявим два интерфейса и один документ с обоими действиями:
package main
import "fmt"
type Printer interface {
Print()
}
type Saver interface {
Save()
}
type Doc struct {
Title string
}
func (d Doc) Print() {
fmt.Println(d.Title)
}
func (d Doc) Save() {
fmt.Println("saved", d.Title)
}
func main() {
item := Doc{Title: "note"}
var p Printer = item
var s Saver = item
p.Print()
s.Save()
}
Одна переменная item легла и в
Printer, и в Saver. В каждой
переменной интерфейса внутри тот же тип
Doc и те же данные, но снаружи
видны разные наборы методов.
Интерфейсы не связаны друг с другом: второй не «расширяет» первый в коде. Просто один тип может удовлетворять нескольким независимым спискам, если у него достаточно методов.
Даны интерфейсы Speaker с методом
Speak и Walker с методом
Walk. Запишите Robot с
обоими методами и положите одно значение
в переменные обоих интерфейсов.
Дан следующий код:
package main
type A interface {
DoA()
}
type B interface {
DoB()
}
type Both struct{}
func (b Both) DoA() {}
func (b Both) DoB() {}
Создайте Both и запишите его в
A и B в одной функции
main.
Скажите, нужно ли в объявлении Doc
перечислять имена интерфейсов, под которые
он подходит.