Inheritance 如何通过a';儿童';将结构转换为接受';家长';结构?
我正在尝试在Go中使用继承,尽管继承在技术上不受支持(据我所知),但您可以通过使用匿名字段获得类似的功能 下面是我如何定义跨两个结构的“继承”:Inheritance 如何通过a';儿童';将结构转换为接受';家长';结构?,inheritance,go,struct,Inheritance,Go,Struct,我正在尝试在Go中使用继承,尽管继承在技术上不受支持(据我所知),但您可以通过使用匿名字段获得类似的功能 下面是我如何定义跨两个结构的“继承”: //Parent struct: type FSEntity struct { guid GUIDNumber } //Child struct: type DataBlock struct { FSEntity data []byte } 我现在有一个定义如下的函数,它应该接受父结构的一个实例FSEntity: Put
//Parent struct:
type FSEntity struct {
guid GUIDNumber
}
//Child struct:
type DataBlock struct {
FSEntity
data []byte
}
我现在有一个定义如下的函数,它应该接受父结构的一个实例FSEntity
:
Put(entity FSEntity) {....}
但是当我尝试将DataBlock
的实例(通过继承也是FSEntity
)传递到上面的Put
函数时,如下所示:
guidNumber := GUIDNumber(1234)
value := []byte("sample string")
dataBLock := DataBlock{FSEntity{guidNumber}, value}
Put(dataBLock)
在上面的最后一行,我得到了这个错误:
cannot use dataBLock (type DataBlock) as type FSEntity in argument to Put
如何解决此问题?解决此问题的最简单方法是满足参数的类型:传递一个
FSEntity
。如果只需要从嵌入它的结构获取FSEntity
,那么只需执行dataBlock.FSEntity
//Parent struct:
type FSEntity struct {
guid string
}
//Child struct:
type DataBlock struct {
FSEntity
data []byte
}
func main() {
myVar := DataBlock{}
myVar.guid = "test"
myVar.data = []byte("moar test")
a(myVar.FSEntity)
}
func a(x FSEntity) {
fmt.Printf("%+v\n", x)
}
()我认为你使用的术语给你带来了问题。在put中,您只需要像这样引用内部结构
Put(dataBLock.FSEntity)
但要澄清的是,这里没有父母/子女关系。您正在使用一种称为嵌入的语言功能,其工作方式类似于组合(即一种类型由其他类型组成),只有您嵌入的内容的字段/方法被提升到嵌入范围。由于这个原因,您不能传入您正在调用的“child”类型,因为这里没有多态行为,就像您从一个类型继承时一样,相反,您的类型是由它组成的,但是您可以访问它的字段,而无需额外的间接级别。由于您的方法接受嵌入类型作为参数,因此必须显式引用它才能传递该参数。外部结构决不是那种类型。它不完全是继承,其思想是将Put定义为方法
func (entity FSEntity) Put() {....}
然后在嵌入之后
type DataBlock struct {
FSEntity
data []byte
}
数据块可以使用此方法
dataBLock.Put()
接口将帮助您接受父结构,但我想要的功能是,在Put中,我还应该能够访问“子”结构变量。我认为这是不可能的。谢谢你的解释。所以我根本不可能在围棋中使用正确的继承?因为我想要的功能是在
Put()
中,我能够访问这两个类的变量,如果我简单地执行Put(dataBLock.FSEntity)
@Ahmad,这是不可能的,如果你想访问两个结构上的变量,您必须更新Put
的定义,使其参数的类型为DataBlock
。围棋没有继承权。你必须以不同的方式思考这个问题。当多态性在语言中不作为一个概念存在时,您试图利用它。如果您想要这种类型的动态行为(比如包含许多类型的集合,这些类型应该具有一些公共行为/字段/ect),那么您可以在接口后面抽象它。
package main
import (
"fmt"
)
type Guider interface {
Guid() string
}
type FSEntity struct {
guid string
}
func (e FSEntity) Guid() string {
return e.guid
}
//Child struct:
type DataBlock struct {
FSEntity
data []byte
}
func main() {
myVar := DataBlock{}
myVar.guid = "test"
myVar.data = []byte("moar test")
Put(myVar)
}
func Put(x Guider) {
fmt.Printf("%+v\n", x)
}