我正在制作斐波那契堆。(它们在我正在使用的算法类中多次提到,并且我想将它们检出。)我希望堆使用任何类型的节点,因此我定义了一个Node接口:
package node
type Node interface {
AddChild(other Node)
Less(other Node) bool
}
type NodeList []Node
func (n NodeList) AddNode(a Node) {
n = append(n, a)
}
(我使用[] Node数组,因为它与堆定义具有相同的影响。)如您所见,Node接口使用Node类型的参数定义了它的两个函数。这应该意味着函数必须接受实现Node接口的参数。堆的其余部分使用这些节点。
在使用此堆的程序中,我创建一个实现Node接口的类型:
package main
import "container/list"
import node "./node"
type Element struct {
Children *list.List
Value int
}
func (e Element) AddChild(f Element) {
e.Children.PushBack(f)
}
func (e Element) Less(f Element) bool {
return e.Value < f.Value
}
func main() {
a := Element{list.New(), 1}
n := new(node.NodeList)
n.AddNode(a)
}
但是,这没有用。编译器抱怨Element没有正确的接口函数定义。
cannot use a (type Element) as type node.Node in function argument:
Element does not implement node.Node (wrong type for AddChild method)
have AddChild(Element)
want AddChild(node.Node)
这是怎么了 显然,Element不能正确实现接口,但是我认为这是因为我定义接口的方式。在Go中有正确的方法来做我想做的事吗?接口可以引用自己吗?
白板的微信
相关分类