我是Go语言的新手,我想知道如何在Java中实现一个类似于抽象类和方法的结构。在Java中,我会这样做:
abstract class A{
static method1(){
...
method2();
...
}
abstract method2();
}
class B extends A{
method2(){
...
}
}
class C extends A{
method2(){
...
}
}
我知道接口和结构体。我可以构建一个接口,然后构建一个结构体来实现方法1。但是方法2呢?我知道我可以将一个接口嵌入到另一个接口中,也可以将一个结构体作为另一个结构体的字段。但是我看不到用这些方法实现我的结构体的方法。
我看到的唯一解决方案是在类B和类C中都实现method 1。没有其他方法吗?
注意:当然,在我的例子中,它不仅仅是一个方法,而且我有一个抽象类的层次结构,并不真的想把所有的东西都移到“子类”中。
我在网上找到的例子大多数都是每个接口只有一个方法。如果你们能给予我一个提示就太好了!谢谢。
6条答案
按热度按时间9fkzdhlc1#
您可以拥有复合接口,例如来自io包的接口:
http://golang.org/src/pkg/io/io.go?s=2987:3047#L57
顺便说一句,不要试图用go实现java代码,试着学习Go Way。
uubf1zoe2#
由于Go语言没有面向对象的
static
方法,所以我们经常看到这些类型的方法被实现为包级函数:这样的包级函数会把接口作为参数,这时你的代码看起来像这样:
输出:
lf5gs5x23#
这就是我实现抽象类的方法--避免遇到循环引用和维护良好工厂模式的简单方法。
让我们假设组件具有以下包结构
定义组件的定义,在本例中,将在此处定义:
组件/类型.go
现在假设我们想创建一个抽象类,它只实现Sum和Average,但是在这个抽象实现中,我们希望能够使用由所实现的A和B返回的值
要实现这一点,我们应该为抽象实现的抽象成员定义另一个接口
组件/基础/类型.go
然后我们可以继续实现抽象“类”
组件/基础/抽象.go
现在,我们继续进行实现
组件/impl 1/impl.go//对impl 2取类似值
我们使用一个单独的接口而不是使用同一个IComponent接口的原因是,如果我们在这种情况下使用同一个接口,如果我们在impl中导入base包来使用抽象“类”,并且我们在components包中导入impl包,这样工厂就可以注册它们,我们会发现一个循环引用。
因此,我们可以有这样的工厂实现
组件/工厂.go
jecbmhm34#
Go语言的面向对象概念来自SmallTalk,而不是像C那样的Simula,也不是来自Java,Java的OO概念来自C,记住这一点,Go语言就会变得清晰明了。
因此,在Go语言中没有类的概念,只有对象,发送和接收消息。Go语言的接口在概念上可以解释为消息的集合。
Go语言类型并不“实现”接口,它们只是实现了作为某个接口一部分的消息。
重复一遍:Go语言中没有类,没有抽象基类,因此也就没有“基于类的设计”(如Small Talk)。
毫无疑问,在Go语言中实现ABC会是一团乱麻,这一点我们可以清楚地看到。
fae0ux8s5#
我使用这个技巧用常见的实现来实现一些sugar API:
下面是程序输出:
bxjv4tth6#
除非从method 1中删除static关键字,否则您所请求的示例将无法在Java中编译,因此Java中正确的抽象类应该如下所示。
要在go-lang中提供等价的接口,你必须以如下方式使用接口:Go Playground
既然这仍然不是一件容易的事情,如何翻译/实现java抽象类/多继承到go-lang,这里有一个详细的帖子。Abstract Class in golang