首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口的定义与其实现脱钩

接口的定义与其实现脱钩
EN

Stack Overflow用户
提问于 2020-03-22 19:14:37
回答 1查看 382关注 0票数 1

在巡回赛的过程中,给出了下面的摘录,但我无法理解它的意义(我猜我缺乏OOP知识)。

Go中的接口定义为一组方法签名。在Go中,接口是隐式的。因此,不需要在给定的类型上定义它实现了某个接口。这样做的好处是,接口的定义与它的实现是解耦的,然后可以在没有预先安排的情况下出现在任何包中。

decoupling a definition of an interface from its implementation有何优势?我最初的想法是,这种方法大大减少了接口的“刚性”(也就是意义)。这仅仅是句法-糖和东西实际上“正常工作”在引擎盖下?

谢谢您抽时间见我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-22 19:32:55

这被称为“鸭子类型”,它允许在需要的地方定义接口,而不是数据类型本身的一部分。考虑以下类型:

代码语言:javascript
复制
type X struct {...}

func (X) f()
func (X) g()
func (X) h()

X类型有三种方法:f()g()h()。如果您有需要调用f()方法的数据结构或函数,则可以定义一个接口:

代码语言:javascript
复制
type FIntf interface {
   f()
}

现在,X实现了这个接口。您可以在需要X的地方传递FIntf实例。

如果在另一个模块中需要g()h(),您可以在那里定义一个接口:

代码语言:javascript
复制
type GIntf interface {
  g()
  h()

现在,X实现了GIntf

如果您有一个不实现所需接口的第三方库,这尤其有用。您可以简单地在其中定义一个接口,并使用具有正确方法集的第三方类型来实现您的接口。

这种方法的主要优点是仍然可以模仿传统的接口概念,在这里定义接口和接口的具体实现。除此之外,您还可以灵活地根据需要定义不同的接口,而无需修改实现。在像Java这样的语言中,如果您有一个获得特定接口的函数,而如果您的对象没有,那么您必须编写一个适配器,即使方法集存在于原始类型上。进去吧,你不需要那样做。

鸭类型在调用方法时也允许类型安全。例如,如果有一个函数必须调用其参数之一的方法x()y(),则定义包含x()y()的接口,并使用类型断言验证参数实现这两个方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60803803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档