猿问

以另一个形式实现一个接口

我希望实现fmt.Stringer接口的String方法。但是,对于从派生的一组类型Node,其实String现将是Print必须提供的接口方法的包装。如何String为所有类型的实现自动提供Node?如果我String在某些基类上提供了默认值,那么我将无法访问派生类型(因此也无法访问接口方法Print)。


type Node interface {

    fmt.Stringer

    Print(NodePrinter)

}


type NodeBase struct{}


func (NodeBase) String() string {

    np := NewNodePrinter()

    // somehow call derived type passing the NodePrinter

    return np.Contents()

}


type NodeChild struct {

    NodeBase

    // other stuff

}


func (NodeChild) Print(NodePrinter) {

    // code that prints self to node printer

}


繁花如伊
浏览 226回答 3
3回答

ABOUTYOU

Go明确声明不可能:当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当调用它们时,该方法的接收者是内部类型,而不是外部类型。对于解决方案,我建议这样的事情:func nodeString(n Node) string {    np := NewNodePrinter()    // do stuff    n.Print(np)    return np.Contents()}// Now you can add String method to any Node in one linefunc (n NodeChild) String() string { return nodeString(n) }
随时随地看视频慕课网APP

相关分类

Go
我要回答