Go 工厂模式中的结构继承
我需要为某些结构创建继承器:Go 工厂模式中的结构继承,go,inheritance,factory,Go,Inheritance,Factory,我需要为某些结构创建继承器: // Not interface, pure struct type Base struct { A int B string } type Child struct { Base C bool } func (c *Child) SomeLoop() { for { // business logic } } 创建子实例并从工厂返回 func maker() *Base { child := &Child {
// Not interface, pure struct
type Base struct {
A int
B string
}
type Child struct {
Base
C bool
}
func (c *Child) SomeLoop() {
for {
// business logic
}
}
创建子实例并从工厂返回
func maker() *Base {
child := &Child {
Base {
A: 1
B: "2"
},
C: false,
}
go child.Some()
return child
}
从工厂生成的对象使用字段A和B作为基本结构
o := maker()
fmt.Println(o.A, o.B)
但我无法从maker func返回子对象作为基。如何实现这种模式?Golang没有继承,只有嵌入。不能从maker将子项返回为*Base。但是,您可以返回&child.Base,并在过程中丢失返回值中指向child的链接 最接近您想要的是为Base定义一个接口{},该接口具有函数返回A和B值的能力: 键入BaseInterface接口{//实际上不要这样命名它 //您通常会忽略Get,但是 //稍后我们会发现名称与字段冲突。 //这可以通过使它们小写(即private)来避免。 GetA int GetB字符串 } 然后,您可以为*Child实现以下功能: //注意这是如何为Child和*Child实现BaseInterface的。 func child*child GetA int{ 返回孩子 } func child*child GetB字符串{ 返回儿童 } 然后,您可以将其作为BaseInterface返回,如果需要,稍后执行类型断言以获取*Child的原始类型: returnedValue.*Child//是的,这确实是语法的样子。
这有时是必要的,并且已经被Golang的接收者之一Rob Pike承认是他们在此期间不自豪的语言的一个方面。需要注意的是,不要试图在代码中引入复杂的东西,而这种语言就是为了避免这些复杂的东西而设计的。Go中没有继承。完全可以。不能将*子项作为*基返回,因为它们是不同的类型。这一点应该很清楚。你想要达到的实际目标是什么?可能还有更好的方法。看起来你是在应用其他语言生态系统中的术语。围棋本身就是一种独特的语言。因此,请告诉我们您希望实现什么样的行为—这是一种可行的方法。我希望从几个结构创建对象,并将其存储在切片对象中:=[]Base{makeChild1,//fabric of Child1 makeCHilds2,//fabric of Child2 makeChild3,//fabric of Child3}for{,o:=范围对象{fmt.Printlno.A,o.B}基本结构是外部的。我不能从外部包修改基本结构。当你说结构时,我很确定你的意思是,我是对的吗?