Go语言中Interface淡化了面向对象中接口应具有的象征意义,接口在Go语言中仅仅只是“表现形式”上相同的一类事物的抽象概念。在Go语言中只要是具有相同“表现形式”的“类型”都具有相同的Interface,而不需要考虑这个Interface在具体的使用中应具有的实际意义。这样的话,就把Interface的成本交给使用者了,而不是交给设计者。
设计者只负责设计method,也就是Interface的构成元素,Interface在具体的使用中应该有的实际意义都是交给Interface的使用者去确定。举个最简单的例子:
跑假设有两种意思:一种是逃跑,英文叫escape;另一种是跑步,英文叫run。如果中文就一种,把他叫做pao。
type BadMan struct{ } func (badMan *BadMan) pao(){ } type SportMan struct{ } func (sportMan *SportMan) pao(){ } //设计人员只考虑这部分 type Pao Interface{ pao() } //这个部分由使用者考虑 var paoA Pao = new(BadMan) var paoB Pao = new(SportMan)
虽然两个类型的pao接口实际意义不一样,但对Go语言来说,我认为他们的接口是一样的,因为“表现形式”相同。至于在什么情景下应该去使用BadMan或SportMan的pao接口才能正确地完成任务,这个是使用者考虑的,设计Interface的人员不要考虑。
go的interface更加接近interface这个概念的本质,因为对于实现了这个interface的类型里面的任何一个方法的类型而言,都可以划归到这个interface种群里面。而面向对象设计语言里面,类型必须安全实现interface的内容才能被其管理,否则就是一个抽象类。离诞生对象的类型还差一布。
在抽象与实例化的道路上,go语言一步到位,而java和cpp如果想一步到位的化,那么必须实现interface的全部方法。
有疑问加站长微信联系(非本文作者)