作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我使用的一个库有一个包含多种方法的类型:
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()
本身而不创建子类?
最佳答案
您不需要代理方法调用来委托(delegate)它们,这正是 embedding是为了。
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
。
关于go - 在类型结构上包装许多方法之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51109957/
我是一名优秀的程序员,十分优秀!