Google Go 中抽象类/方法 (Java) 的等效性

2022-09-03 13:03:41

我是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 类中同时实现 method1。难道没有另一种方法吗?

注意:当然,在我的情况下,这不仅仅是一种方法。此外,我有一个抽象类的层次结构,并且真的不想将所有内容都移动到“子类”中。

我在互联网上找到的例子大多是每个接口只有一种方法。如果你们中的一个人能在这里给我一个提示,那就太好了!谢谢。


答案 1

您可以拥有复合接口,例如从 io 包中:

http://golang.org/src/pkg/io/io.go?s=2987:3047#L57

type Reader interface {
    Read(p []byte) (n int, err error)
}
type Writer interface {
    Write(p []byte) (n int, err error)
}

type ReadWriter interface {
    Reader
    Writer
}

作为旁注,不要尝试使用go实现java代码,尝试学习Go Way


答案 2

由于 Go 没有 OOP 意义上的方法,因此您经常会看到这些类型的方法作为包级函数实现:static

package mypackage

func() Method1() { ... } // Below I will call it Function instead

然后,此类包级函数将采用接口作为参数。在这种情况下,您的代码将如下所示:

package main

import "fmt"

type Methoder interface {
    Method()
}

func Function(m Methoder) {
    m.Method()
}

type StructB struct{}

func (s *StructB) Method() { fmt.Println("StructB") }

type StructC struct{} // You can do some "inheritance" by embedding a base struct

func (s *StructC) Method() { fmt.Println("StructC") }

func main() {    
    b := &StructB{}
    Function(b)    
}

输出:

StructB

推荐