为了账号安全,请及时绑定邮箱和手机立即绑定

使用具有数据和成员函数的接口进行继承的 GoLang 等效项

使用具有数据和成员函数的接口进行继承的 GoLang 等效项

Go
qq_笑_17 2021-10-18 09:58:07
我是一个 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}现在我想做以下事情:以某种方式保留 ' data DatumType'base以便查看定义base可以知道所有结构共有哪些数据。common_func()在一个地方实现,这样派生的结构就不需要这样做了。我尝试使用接口实现该功能,但编译失败。我试图创建一个结构并从中继承,但没有找到好的方法来做到这一点。有什么干净的出路吗?
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

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.


查看完整回答
反对 回复 2021-10-18
?
动漫人物

TA贡献1815条经验 获得超10个赞

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


在这种情况下,您不需要/不想定义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


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信