Go 中的接口方法重写
与 Java 不同,方法重写涉及继承和修改基类的实现,Go 提供了一种解决方案接口。
接口定义了类型必须实现的一组方法签名。通过创建一个具有与所需行为相匹配的方法的接口,您可以用一种新类型来实现它,以代替原始类型。
要实现此目的,请考虑以下示例:
type Base struct{} func (base *Base) Get() string { return "base" } func (base *Base) GetName() string { return base.Get() }
要实现方法重写,请创建一个接口:
type Getter interface { Get() string }
修改 Base 类型以嵌入 Getter 接口:
type Base struct { Getter }
现在,创建一个新类型嵌入 Base 并实现 Get 方法:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
最后,修改 Base 中的 GetName 方法以利用 Getter 接口:
func (base *Base) GetName() string { if g, ok := base.Getter.(Getter); ok { return g.Get() } else { return base.Get() } }
这种方法可以让您保留 Base 的现有消费者同时提供了在子类中重写 Get 方法的能力。
或者,您也可以使用以下方法:
func New() *Sub { userType := &Sub{} userType.Getter = interface{}(userType).(Getter) return userType }
这种情况下,您必须手动设置 Getter 中的字段用于启用方法重写的用户代码。两种方法都达到了预期的结果,但第一种方法在 Go 中被认为更惯用。
以上是Go中如何使用接口实现方法重写?的详细内容。更多信息请关注PHP中文网其他相关文章!