Go 中的多态性:存在吗?
多态性,即不同类的对象具有相同方法的能力,是一个基本方面面向对象编程。然而,在 Go 中,接口的 setter 方法似乎不可用。
让我们看一个基本示例:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data } func (this MyStruct) Set(i int) { this.data = i }
运行此代码时,MyStruct 类型的 Set 方法失败,因为接收者不是指针。当函数退出时,对此所做的任何更改都会丢失。
人们可能会尝试通过将接收器更改为指针来修复此问题:
func (this *MyStruct) Set(i int) { this.data = i }
但是,这会导致编译错误。 Go 中的接口方法不能有指针接收器。
那么,在这种情况下有没有办法实现多态性?
最接近的替代方法是使用接口类型和实现接口的匿名结构:
type MyInterfacer interface { Get() int Set(i int) } var mi MyInterfacer = &MyStruct{123} fmt.Println(mi.Get()) // prints 123 mi.Set(456) fmt.Println(mi.Get()) // prints 456
虽然此解决方案不是真正的多态性,但它利用接口来提供一种干净而灵活的方式来操作不同类型的对象。
以上是Go 是否支持多态性:寻找 Setter 方法的解决方法?的详细内容。更多信息请关注PHP中文网其他相关文章!