明示的に判別ないとインタフェースの型として振る舞えない
以下のように、同じName
というメソッドを持つ構造体を埋め込むと、Named
というName
を持つインタフェースを実装できない。
なぜならば、Hoge
のName
を呼べばいいのか、Piyo
のName
を呼べばいいのか分からない。
もちろん、Foo
型として振る舞っているときは明示的に埋め込んでいる型を指定すれば、呼び出せる。
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
のメソッドとして、明示定義してやればいい。
func (f *Foo) Name() string {
return f.Piyo.Name()
}