Обернуть один из многих методов в структуру типа? - PullRequest
0 голосов
/ 30 июня 2018

Библиотека, которую я использую, имеет тип с несколькими методами:

type Foo struct {
}

func (f *Foo) method1() int { ... }
func (f *Foo) method2() int { ... }
func (f *Foo) method3() int { ... }
// ... and so on

Я бы действительно хотел применить определенное поведение каждый раз, когда я вызываю method1 для этого типа:

func (f *Foo) method1Wrapper() int {
    incrementCounter()
    return f.method1()
}

Но это добавляет новый метод, который я должен был бы вызвать вместо просто прямого вызова method1() самого себя.

В качестве альтернативы, я думаю, я мог бы создать свой собственный тип:

type Foo2 struct {
    Foo
}

func (f *Foo2) method1() int {
    incrementCounter()
    return f.Foo.method1()
}

Но тогда мне нужно было бы создать набор шаблонного кода для прокси всех вызовов method2, method3 и т. Д. Вплоть до реализации Foo, и . изменить все мои использования от Foo до Foo2. ?

Возможно ли непосредственно исправить или обернуть Foo.method1() само по себе без создания подкласса?

1 Ответ

0 голосов
/ 30 июня 2018

Вам не нужно проксировать вызовы методов, чтобы делегировать их, это именно то, для чего встраивание предназначено.

type Foo struct {
}

func (f *Foo) method1() int { return 1 }
func (f *Foo) method2() int { return 2 }
func (f *Foo) method3() int { return 3 }

type Foo2 struct {
    *Foo
}

func (f Foo2) method1() int {
    fmt.Println("WRAPPED")
    return f.Foo.method1()
}

Foo2 имеет тот же метод, что и Foo, но method1 "перехватывается" Foo2, что явно вызывает Foo.method1 внутри.

https://play.golang.org/p/q8tea5ZuHl4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...