gpt4 book ai didi

oop - 将接口(interface)的定义与其实现分离

转载 作者:行者123 更新时间:2023-12-01 20:25:09 24 4
gpt4 key购买 nike

在 Tour of Go 的过程中,出现了以下摘录,但我无法理解它(我猜我缺乏 OOP 知识)。

An interface in Go is defined as a set of method signatures. In Go interfaces are implicit. So there is no need to define on a given type that it implements a certain interface. The advantage of this is that the definition of an interface is decoupled from its implementation which could then appear in any package without prearrangement.


decoupling a definition of an interface from its implementation怎么样有利?我最初的想法是,这种方法大大降低了接口(interface)的“刚性”(也就是重要性)。它只是语法糖,事情实际上在引擎盖下“正常工作”吗?

感谢您的时间。

最佳答案

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

type X struct {...}

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

类型 X有三种方法, f() , g() , h() .如果你有一个数据结构或函数需要调用 f()方法,你可以定义一个接口(interface):
type FIntf interface {
f()
}

现在 X实现该接口(interface)。您可以传递 X 的实例在哪里 FIntf是需要的。

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

现在 X实现 GIntf .

如果您有一个没有实现您需要的接口(interface)的第三方库,这将特别有用。您可以在使用它的地方简单地定义一个接口(interface),并使用具有正确方法集的第三方类型来实现您的接口(interface)。

这种方法的主要优点是您仍然可以模拟传统的接口(interface)概念,您可以在其中定义接口(interface)及其具体实现。最重要的是,您可以根据需要灵活地定义不同的接口(interface),而无需修改实现。在像 Java 这样的语言中,如果您有一个获得特定接口(interface)的函数,而您的对象没有,那么即使方法集存在于原始类型上,您也必须编写一个适配器。在 Go 中,您不需要这样做。

在调用方法时,鸭子类型也允许类型安全。例如,如果您有一个必须调用方法 x() 的函数。和 y()在它的一个参数中,定义一个包含 x() 的接口(interface)和 y() ,并使用类型断言来验证参数是否实现了这两种方法。

关于oop - 将接口(interface)的定义与其实现分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60803803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com