【发布时间】:2015-12-04 01:34:22
【问题描述】:
是否可以在不使用嵌入式结构的情况下继承某个类型的方法?
代码的第一个 sn-p 是在 Node 中嵌入 Property 结构的工作代码,我可以调用 node.GetString 这是 Properties 上的一个方法。我不喜欢的是当我初始化 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 中的工作原理......所以我不确定是否有解决方法。组合,而不是继承。 -
嵌入被称为嵌入是有原因的;)所有属性字段都嵌入到节点中。
标签: go