MENU

[FAQ]为什么没有类型继承?

November 7, 2020 • Go FAQ

面向对象编程,至少在最著名的语言中,涉及了太多在类型之间关系的讨论, 关系总是可以自动地推断出来。Go则使用了一种不同的方法。
不像需要程序员提前声明两个类型的关联,在Go中类型会自动满足任何接口, 以此实现其方法的子集。除了减少记账式编程外,这种方法拥有真正的优势。 类型可立刻满足一些接口,而没有传统多重继承的复杂性。 接口可以非常轻量——带一个甚至零个方法的接口能够表达一个有用的概念。 若出现了新的想法,或为了测试目的,接口其实可以在以后添加——而无需注释掉原来的类型。 由于在类型和接口之间没有明确的关系,也就无需管理或讨论类型层级。
用这些思想来构造一些类似于类型安全的Unix管道是可能的。例如,看看 fmt.Fprintf 如何能将格式化打印到任何输出而不只是文件, 或 bufio 包如何能从文件I/O中完全分离,或 image 包如何生成已压缩的图像文件。所有这些想法都来源于一个单一的接口 (io.Writer),都由一个单一的方法来表现(Write)。 而这只是表面文章。Go的接口在如何组织程序方面有着深刻的影响。
它需要一段时间来适应,但这种隐式的类型依赖是Go中最具生产力的东西之一。

ArchivesQR Code
QR Code for this page
Tipping QR Code