defined类型继承的方法集合 #
Go 语言中,凡通过类型声明语法声明的类型都被称为 defined 类型:
type I interface {
M1()
M2()
}
type T int
type NT T // 基于已存在的类型T创建新的defined类型NT
type NI I // 基于已存在的接口类型I创建新defined接口类型NI
新定义的 defined 类型与原 defined 类型是不同的类型,那么它们的方法集合上又会有什么关系呢?新类型是否“继承”原 defined 类型的方法集合呢?
- 基于接口类型创建的 defined 接口类型,新类型的方法集合与原接口类型的方法集合是一致的。
- 基于非接口类型创建 defined 非接口类型,新类型不会“继承”原类型的任何方法。
对于第2点,我们通过下面例子来看一下:
package main
type T struct{}
func (T) M1() {}
func (*T) M2() {}
type T1 T
func main() {
var t T
var pt *T
var t1 T1
var pt1 *T1
dumpMethodSet(t)
dumpMethodSet(t1)
dumpMethodSet(pt)
dumpMethodSet(pt1)
}
在这个例子中,我们基于一个 defined 的非接口类型 T 创建了新 defined 类型 T1,并且分别输出 T1 和 *T1 的方法集合来确认它们是否“继承”了 T 的方法集合。运行这个示例程序,我们得到如下结果:
main.T's method set:
- M1
main.T1's method set is empty!
*main.T's method set:
- M1
- M2
*main.T1's method set is empty!
从输出结果上看,新类型 T1 并没有“继承”原 defined 类型 T 的任何一个方法。从逻辑上来说,这也符合 T1 与 T 是两个不同类型的语义。
基于自定义非接口类型的 defined 类型的方法集合为空的事实,也决定了即便原类型实现了某些接口,基于其创建的 defined 类型也没有“继承”这一隐式关联。也就是说,新 defined 类型要想实现那些接口,仍然需要重新实现接口的所有方法。