[Go言語] 埋め込んだときに、メソッド名が被っててインタフェースを実装できない場合はどうするのか?
September 29, 2013
この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。
明示的に判別ないとインタフェースの型として振る舞えない
以下のように、同じName
というメソッドを持つ構造体を埋め込むと、Named
というName
を持つインタフェースを実装できない。
なぜならば、Hoge
のName
を呼べばいいのか、Piyo
のName
を呼べばいいのか分からない。
もちろん、Foo
型として振る舞っているときは明示的に埋め込んでいる型を指定すれば、呼び出せる。
http://play.golang.org/p/oRWf4VQnql
package main
import "fmt"
type Named interface {
Name() string
}
type Hoge struct {
}
func (_ *Hoge) Name() string {
return "Hoge"
}
func (_ *Hoge) HogeMethod() {
fmt.Println("Hoge Method!")
}
type Piyo struct {
}
func (_ *Piyo) Name() string {
return "Piyo"
}
func (_ *Piyo) PiyoMethod() {
fmt.Println("Piyo Method!")
}
type Foo struct {
*Hoge
*Piyo
}
func hello(named Named) {
fmt.Println("Hello", named.Name())
}
func main() {
hoge := &Hoge{}
piyo := &Piyo{}
foo := &Foo{hoge, piyo}
fmt.Println(foo.Hoge.Name())
fmt.Println(foo.Piyo.Name())
foo.HogeMethod()
foo.PiyoMethod()
hello(foo)
}
明示的に定義する
どっちか分からないならFoo
のメソッドとして、明示定義してやればいい。
http://play.golang.org/p/xYMbf7oO3J
func (f *Foo) Name() string {
return f.Piyo.Name()
}