hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - 埋め込みによる構造体の継承

構造体Fooを構造体Barに埋め込む(フィールド名をつけないメンバとする)ことで、継承の様なことができる。

package main

import "fmt"

type Foo struct {
	name string
}
func(f *Foo)hello() {
	fmt.Println("Hello", f.name)
}

type Bar struct{
	Foo
}
func(b *Bar)bye() {
	fmt.Println("Bye", b.name)
}

func main() {
	var f Foo
	f.name = "taro"
	f.hello()                //-> Hello taro
	
	g := &Foo{"jiro"}
	g.hello()                //-> Hello jiro

	h := &Bar{Foo{"hanako"}}
	h.hello()                //-> Hello hanako
	h.bye()                  //-> Bye hanako

}

メソッドのオーバーライド?

埋め込む構造体と埋め込まれる構造体に同じメソッドがある場合は、埋め込む構造体(継承された構造体?)のメソッドが有効になる。

package main

import "fmt"

type foo struct {
	i int
}
func (self *foo)get() int {
	return self.i
}

type bar struct {
	foo
}
func (self *bar)get() int {   // fooと同じ名前のメソッド
	return self.i*2
}


func main() {
	a := &bar{foo{10}}

	fmt.Println(a.get()) //-> 20
}