Go的接口编程模型与OOP相比如何?

时间:2013-01-14 16:01:42

标签: oop go

我已经阅读了大部分Go巡演教程,但我还不清楚Go的界面编程模型与OOP的比较?

有人可以解释我如何开始'在Go中思考'吗?

我很困惑如何定义界面,然后根据界面创建对象?

在编译期间,Go是否隐式为您创建了具体的实现?

3 个答案:

答案 0 :(得分:2)

OOP通常试图解决的问题之一是多态性或两个不同类具有相同行为的实例的能力。通常在OOP中,这是通过使用继承来完成的。 Base类定义了其他类扩展的最小接口。 Base类的所有子类都可以用作Base类。

Go不是通过继承而是使用接口来做同样的事情。界面是行为的“描述”。 Go中的各个类型可以通过实现界面中描述的每个方法来满足此描述。如果Type确实实现了接口中描述的所有方法,那么它会自动满足接口,并且可以由编译器自动强制转换到该接口。

答案 1 :(得分:2)

Go的界面系统类似于structural typing。考虑一段python代码:

def foo(bar):
   bar.baz(5)

在这个片段中,我们不知道具体类型bar是什么,但我们可以说它必须有一个baz方法,它接受一个int参数。请注意,当我们编写bar类时,我们不必声明我们正在实现此'接口'(具有采用整数的baz方法)。我们只编写一个baz方法,该方法在使用单个int调用时可以正常工作,我们可以将实例传递给foo方法。

Go以类似的方式工作,但在编译时检查所有内容。在Python中,如果我们将foo方法传递给没有baz方法的类的实例,则会得到运行时异常。在Go中,我们将使用baz方法定义一个接口,并在foo类型中定义该接口的实例。现在任何类型在单个baz上都有int方法,可以满足foo所需的类型。

答案 2 :(得分:0)

传统(Java)OO是关于类层次结构的。您可以使用类,一些抽象,一些final和接口来模拟您的问题。然后你提供实现。

Go让你走另一条路:从具体类型开始并实现你的逻辑。如果出现或需要有用的抽象:将其打包到接口中并重构代码以使用此接口类型。