知识卡片

用嵌入组合代替类继承

专业/工作 · 1370.a.2.a

内容

Go 没有类继承机制,但可以把一个类型作为匿名字段嵌入另一个 struct,被嵌入类型导出的方法就 会提升到外部类型上,外部类型的值可以直接调用这些方法,感觉上很像”外部类型继承了内部类型的 能力”,同时外部类型自己定义的方法可以和提升上来的方法并存、互不冲突。发散:这和继承的关键 区别在于——继承建立的是一种强绑定的”是什么”关系(子类是父类的一种),而嵌入建立的只是”内部 持有一个另一种类型的实。

参考来源

- 位置:《Head First Go语言程序设计》第10章《保密:封装和嵌入》(源文件:_epub-src/index_split_002.html) - 结论依据:原文在该章节围绕“Go没有类继承机制,但可以把一个类型作为匿名字段嵌入另一个struct,被嵌入类型导出的方法就会提升到外部类型…”给出定义、示例或限制条件;摘录中的术语、代码片段或对比关系直接支撑本卡片的结论。 - 原始内容:这个模式在Date类型上定义SetMonth和 SetDay方法。我们只需要在方法中使用指针接收器即可。在调用方法 时,Go会自动把接收器转换为指针,并且在修改struct字段时能够把指 针转换回struct值。 在main函数中,我们创建了一个Date struct的值;通过新的方法设 置了它的Year、Month和Day字段;并且输出…