goで継承っぽいことをやってみました。
作った例
MenとWomenは共通のプロパティとしてnameを持っており、共通のメソッドとしてWalk()を持つ。
また、MenはPower()メソッド、WomenはCook()メソッドをもつ。
ポイントとしてはMenとWomenの構造体が
- プロパティのベースとなるHuman構造体
- Men,Womenの振る舞いを定義したインタフェース
を含むようにして、継承っぽい雰囲気にしています。
package main
import "fmt"
type Human struct {
name string
}
type Men struct {
Human
IMen
}
type Women struct {
Human
IWomen
}
type IHuman interface {
Walk()
}
type IMen interface {
IHuman
Power()
}
type IWomen interface {
IHuman
Cook()
}
func (m *Men) Walk() {
fmt.Printf("%vはてくてく歩く\n", m.name)
}
func (w *Women) Walk() {
fmt.Printf("%vはてくてく歩く\n", w.name)
}
func (m *Men) Power() {
fmt.Printf("%vは力持ち\n", m.name)
}
func (w *Women) Cook() {
fmt.Printf("%vは料理上手\n", w.name)
}
func main() {
takeshi := &Men{Human: Human{name: "takeshi"}}
kasumi := &Women{Human: Human{name: "kasumi"}}
takeshi.Walk()
takeshi.Power()
kasumi.Walk()
kasumi.Cook()
}
// 結果
// takeshiはてくてく歩く
// takeshiは力持ち
// kasumiはてくてく歩く
// kasumiは料理上手
最後に
最近goを勉強し始めたばかりなので、上記のようなコードの場合、本来goならこう書くべき!みたいなのがあれば教えて欲しいです!