まあそれはそう、という感じではあるけど頭から抜けていた。
package main type F interface { Apply() } type f1 struct { } type f2 struct { } func (f1) Apply() { println("call f1!!!") } func (f2) Apply() { println("call f2!!!") } func build(p int) F { switch { case p % 2 == 0: return &f1{} default: return &f2{} } } func main() { var f F for i := 0; i <= 10; i++ { f = build(i) f.Apply() } }
この実行結果は以下のようになる
call f1!!! call f2!!! call f1!!! call f2!!! call f1!!! call f2!!! call f1!!! call f2!!! call f1!!! call f2!!! call f1!!!
それはそうですね。
これを利用してファクトリーメソッドパターンを実装する例をいくつか読んでなるほどなと思ったわけです。この例の場合だと、F
とApply
が公開されていれば、f1
と f2
は公開しなくてもよく、内部実装については秘匿してよい。struct だと必須のメンバーというものを持たせられないけど、interface であれば少なくとも意識して実装しないといけないので便利だ。