inheritance - 別の形式でインターフェースを実装する

inheritance interface struct go base-class

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
}
答え
それが不可能であることをexplicitly declaresに行ってください:


タイプを埋め込むと、そのタイプのメソッドは外部タイプのメソッドになりますが、それらが呼び出されると、メソッドのレシーバーは内部タイプであり、外部タイプではありません。


解決策として、私はこのようなものをお勧めします:

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 line
func (n NodeChild) String() string { return nodeString(n) }
関連記事

c++ - 多重継承で継承されたデータメンバーへのポインター

c++ - クラスを適切に構築して継承するにはどうすればよいですか?

java - 最後のメソッドで「子」オブジェクトのクラスを取得しますか?

scala - 複数の特性ミックスインとアクターの問題

wcf - WCFサービスの継承(サービスの拡張)

c++ - DLLからロードされた派生クラスインスタンスから基本クラスベクトルメンバーにアクセスしようとすると、プログラムがクラッシュする

python - matplotlibはdatetimeクラスのプロットから継承します

inheritance - JPA 2 Inheritance.TABLE_PER_CLASS(抽象関係あり)

javascript - Coffeescriptのコンパイル時に変数を追加しないでください

c++ - フレンド関数は同じファイルにある必要がありますか?