GoLang使用与数据和成员函数的接口等效于继承

时间:2015-06-13 08:24:48

标签: inheritance go

我是一个golang新手,所以请原谅我,如果有一些明显我失踪的东西。我有以下结构:

type base interface {
    func1()
    func2()
    common_func()
}

type derived1 struct {
    base // anonymous meaning inheritence
    data DatumType
}

type derived2 struct {
    base // anonymous meaning inheritence
    data DatumType
}

现在我想做以下事情:

  1. 以某种方式将“data DatumType”与base保持一致,以便查看base的定义,可以知道所有结构共有哪些数据。
    1. 在一个地方实施common_func(),以便派生的结构不需要这样做。
  2. 我尝试用接口实现该功能,但编译失败。我试图创建一个结构并从中继承,但我没有找到好的方法来做到这一点。有一些干净的出路吗?

2 个答案:

答案 0 :(得分:3)

Go没有继承权。相反,它提供了embedding的概念。

在这种情况下,您不需要/想要将base定义为interface。使其成为结构并将函数定义为方法。然后在派生的结构中嵌入base将为它们提供这些方法。

type base struct{
    data DatumType     
}
func (b base) func1(){

}

func (b base) func2(){

}

func (b base) common_func(){

}

type derived1 struct {
    base // anonymous meaning embedding
}

type derived2 struct {
    base // anonymous meaning embedding
}

现在你可以做到:

d := derived1{}
d.func1()
d.func2()
d.common_func()

并且(正如David Budworth在评论中指出的那样)您可以通过引用base的类型来访问d.base.data = something 的字段:

$suppress_localhost = true;

答案 1 :(得分:2)

Go中没有继承。使用组合:

type common struct {
    data DatumType
}

func (c *common) commonFunc() {
    // Do something with data.
}

type derived1 struct {
    common
    otherField1 int
}

// Implement other methods on derived1.

type derived2 struct {
    common
    otherField2 string
}

// Implement other methods on derived2.