Goの継承の代替え方法

Goには継承という概念がない。そのため構造体をうまく利用して埋め込む

  • 埋め込みを使う
  • オーバライドはラッパークラスにレシーバを実装
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 (b *Bar) Hello() {
    fmt.Println("Hello2", b.name)
}

type Oui interface {
    Hello()
}

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

    var o Oui = &Bar{Foo{"ginta"}}
    o.Hello()

}