在不使用嵌入式结构的情况下,是否可以继承类型的方法?
第一个代码片段是嵌入Property
结构体到Node
中的工作代码,并且我能够调用Properties
上的node.GetString
方法。但我不喜欢的是当我初始化Node
时,必须初始化其中的Properties
结构体。有没有解决这个问题的方法?
package main
import "fmt"
type Properties map[string]interface{}
func (p Properties) GetString(key string) string {
return p[key].(string)
}
type Nodes map[string]*Node
type Node struct {
*Properties
}
func main() {
allNodes := Nodes{"1": &Node{&Properties{"test": "foo"}}} // :'(
singleNode := allNodes["1"]
fmt.Println(singleNode.GetString("test"))
}
最终,我希望能做出以下类似的事情。其中Node
是Properties
类型,并且初始化不需要初始化Property
结构体。下面的代码不能工作,但可以清楚地表达我的目标。
package main
import "fmt"
type Properties map[string]interface{}
func (p Properties) GetString(key string) string {
return p[key].(string)
}
type Nodes map[string]*Node
type Node Properties
func main() {
allNodes := Nodes{"1": &Node{"test": "foo"}} // :)
singleNode := allNodes["1"]
fmt.Println(singleNode.GetString("test")) // :D
}
我会添加更多的结构,这些结构将使用Properties
的方法,这就是我提出问题的原因。如果我只有 Node
,那么我只需为 Node
编写方法即可完成。但是因为我将拥有不止一个 Node
,所以我觉得在所有嵌入Properties
的结构中添加相同的方法有点冗余。
更确切地说,我想从Node
使用 Properties
的方法,而不必初始化 Properties
。
Properties
对象实例并对其进行操作的函数,而不是将它们附加到对象上。这就是 Go 中的嵌入方式...所以我不确定是否有其他方法。组合而非继承。 - Simon Whitehead