Почему p не удовлетворяет интерфейсу для c (строка 106)? - PullRequest
0 голосов
/ 27 апреля 2020

import "fmt"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type NodeType uint

const (
    COMMAND NodeType = iota
    PROPERTY
    )

type Node interface {
    setChildren(...*Node)
    getChildren() []*Node
    setParent(*Node)
    getParent() *Node
    getFlavor() NodeType
    getValue() string
}



// Command Node

type CommandNode struct {
    self *Node
    parent *Node
    children []*Node
    command string
    level int
    partial, complete bool
}


func (cn *CommandNode) setChildren(child ...*Node) {
    for _,v := range child {
        cn.children = append(cn.children,v)
    }
}

func (cn *CommandNode) getChildren() []*Node {
    return cn.children
}

func (cn *CommandNode) setParent(parent *Node) {
    cn.parent = parent
}

func (cn *CommandNode) getParent() *Node {
    return cn.parent
}

func (cn *CommandNode) getFlavor() NodeType {
    return COMMAND
}

func (cn *CommandNode) getValue() string {
    return cn.command
}

// Property Node

type PropertyNode struct {
    self *Node
    parent *Node
    children []*Node
    property string
    level int
    partial, complete bool
}


func (pn *PropertyNode) setChildren(child ...*Node) {
    for _,v := range child {
        pn.children = append(pn.children,v)
    }
}

func (pn *PropertyNode) getChildren() []*Node {
    return pn.children
}

func (pn *PropertyNode) setParent(parent *Node) {
    pn.parent = parent
}

func (pn *PropertyNode) getParent() *Node {
    return pn.parent
}

func (pn *PropertyNode) getFlavor() NodeType {
    return PROPERTY
}

func (pn *PropertyNode) getValue() string {
    return pn.property
}


func main() {
c := CommandNode{
    command:  "command",
}

p := PropertyNode{
    property: "data 1, data 2, data 3",
}

c.setChildren(&p)

x := c.getChildren()

for k,v := range x {
    fmt.Printf("x[%d] is %v\n",k,v)
}



}

Эта строка -> c.setChildren(p) завершается неудачно при компиляции, говоря, что я не могу использовать PropertyNode в качестве * Node, у меня сложилось впечатление, что PropertyNode имеет методы интерфейса, определенные в интерфейсе Node, я мог бы использовать их взаимозаменяемо?

Моя конечная цель - иметь возможность иметь дерево узлов (разных типов узлов), которые используют одни и те же методы для обхода дерева. Я думал, что мог бы использовать интерфейсы на разных типах узлов чтобы выполнить sh это.

1 Ответ

1 голос
/ 27 апреля 2020

PropertyNode не реализует Node, поскольку setChildren объявлено в интерфейсе как setChildren(...*Node), но реализация имеет setChildren(*Node).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...