【发布时间】:2021-04-07 18:44:04
【问题描述】:
type A interface {
MyFunc()
}
type A struct {
}
func (a *A) MyFunc() {...}
type B struct {
*A
}
var _ A = &B{}
var _ A = (*B)(nil)
由于嵌入了 A,B 实现了接口 A。到目前为止,一切都很好。
但是我如何(静态或在运行时)检查 B 实现了自己的 MyFunc 版本?
更新:无法在编译时静态检查。
func (b *B) MyFunc() {...}
var _ ??? = &B{}
var _ ??? = (*B)(nil)
【问题讨论】:
-
方法集确定是否实现了接口,
B方法集在这两种情况下都包含MyFunc()。定义不同的MyFunc()不会更改方法集。 -
我不明白这与我的问题有什么关系。我知道方法集决定了接口。我想检查它是否因为嵌入 A 或被 B 充满(比如没有嵌入 A 时)而被填满。用例:A 实现了一个标准行为,现在我想检查 B 是否用它自己的实现覆盖了这个标准行为。
-
这是相关的,因为您的示例试图在编译时使用类型系统断言条件,而类型系统没有办法做到这一点。
标签: go interface embedding shadowing