Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Встраивание типов
- Встраивание типов - это способ легко:
- a) Предоставить существующую функциональность новому типу
- б) Требовать, чтобы тип реализовывал несколько интерфейсов
- Вложенные интерфейсы
- ---------------------
- ->Вложенные интерфейсы позволяют вам «встраивать» один интерфейс в другой интерфейс.
- *Реализация интерфейса требует реализации всех встроенных функций.
- *Позволяет избежать дублирования объявлений интерфейсов и
- минимизирует необходимость написания повторяющихся объявлений
- -> Изменения во встроенных интерфейсах автоматически распространяются
- *Облегчается поддержка кодовой базы (ошибки компилятора указывают на то,
- где необходимы обновления)
- Обьявляем интерфейсы:
- type Whisperer interface{ Whisper() string }
- type Yeller interface{ Yell() string }
- Встраиваем интерфейсы в один интерфейс
- type Talker interface {
- Whisperer
- Yeller
- }
- Создаем структуру и реализовываем интерфейс:
- type Waaaa struct {
- }
- func (w *Waaaa) Whisper() string {
- return "WHHHHHH"
- }
- func (w *Waaaa) Yell() string {
- return "YELL"
- }
- //Функция, принимающая интерфейс
- func Do(obj Talker) {
- fmt.Println(obj.Whisper())
- fmt.Println(obj.Yell())
- }
- func trt() {
- var i Waaaa
- Do(&i)
- }
- ===================================================
- ->Вложенные структуры
- *Встроенные структуры (embedded structs) позволяют "встраивать"
- одну структуру внутрь другой структуры
- Структура будет иметь доступ к всем методам-получателям и
- данным встроенной структуры на верхнем уровне
- Это называется продвижением полей и методов (field & method promotion)
- Он обеспечивает удобный доступ к данным встроенной структуры
- без дополнительной косвенности
- type Account struct {
- accountId int
- balance int
- name string
- }
- func (a *Account) String() string {
- return "AccountStr"
- }
- func (a *Account) GetBallance() int {
- return a.balance
- }
- type ManagerAccount struct{ Account }
- //Поведет себя как override в с++, но можно
- //получить функцию базового класса
- func (m ManagerAccount) String() string {
- return "MANAGE ACCOUNTER"
- }
- func Dostruct() {
- mgrAcct := ManagerAccount{Account{-2, 30, "Cassandra"}}
- fmt.Println(mgrAcct)
- fmt.Println(mgrAcct.GetBallance())
- fmt.Println(mgrAcct.String())
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement