#17.3 golang Композиция интерфейсов

Интерфейсы, как и структуры поддерживают композицию.

Мы можем встраивать один интерфейс в другой, тем самым образуя более сложные интерфейсы и создавая композиции интерфейсов.

Давайте рассмотрим пример:


// интерфейс "Платильщник"
type Payer interface {
	Pay(int) error
}

// интерфейс "Звонильщик"
type Ringer interface {
	Ring(string) error
}

type NFCPhone interface {
	// частично возьмем методы из композиации:
	Payer
	Ringer
	// и добавим еще один свой метод:
	sayHello()
}

type MyPhone struct {
	number int
}

// навесим методы для соответствия  NFCPhone
func (*MyPhone) Pay(amount int) error {
	return nil
}
func (*MyPhone) Ring(name string) error {
	return nil
}
func (*MyPhone) sayHello() {
	fmt.Println("Привет!")
}

// Функция принимающая тип композитного интерфейса
func testIt(phone NFCPhone) {
	phone.sayHello()
}

func main() {
	phone := &MyPhone{
		number: 1,
	}
	testIt(phone)
}

-- тут мы:

  • Объявляем интерфейс «Плательщик», который требует метод Pay.
  • И интерфейс «Звонильщик», который требует метод «позвонить».
  • Далее мы объявляем композитный (составной) интерфейс NFCPhone, то есть телефон, который реализует метод «бесконтактная оплата через NFC-технологию».

Этот интерфейс NFCPhone образован композицией двух других интерфейсов: «Плательщик» и «Звонильщик». Получается, что на самом деле интерфейс выглядит вот так:

type NFCPhone interface {
   Pay(int) error
   Ring(string) error
}

-- плюсом к этому мы добавили еще метод sayHello(), чтобы показать, что можно использовать не только композицию, но и одновременно с ней объявлять методы "на месте".