解答 01.3 — 埋め込みと合成(Bird)¶
このノートブックは 01.3-embedding-composition.ipynb の練習問題の解答です。
先に自分の力で解いてから、答え合わせに使ってください。
前提コード(問題ノートブックと同じ定義)¶
In [1]:
import "fmt"
In [2]:
type Animal struct {
name string
}
func (a *Animal) Name() string {
return a.name
}
func (a *Animal) Speak() string {
return "……(動物の鳴き声)"
}
type Dog struct {
*Animal
}
func (d *Dog) Speak() string {
return "ワン!"
}
解答: Bird¶
*Animal を埋め込み、Speak を上書きし、Fly を追加します。
Name() は埋め込みによる昇格で自動的に使えます。
In [3]:
type Bird struct {
*Animal
}
func (b *Bird) Speak() string {
return "ピヨ"
}
func (b *Bird) Fly() string {
return "飛んだ"
}
チェック(問題ノートブックと同じ期待値)¶
In [4]:
import "reflect"
import "fmt"
func mustEqual(got, want any, name string) {
if reflect.DeepEqual(got, want) {
fmt.Printf("✅ Passed: %s\n", name)
return
}
panic(fmt.Sprintf("❌ %s\n got = %v (%T)\n want = %v (%T)", name, got, got, want, want))
}
In [5]:
%%
bird := &Bird{Animal: &Animal{name: "小太郎"}}
mustEqual(bird.Name(), "小太郎", "Name() が Animal から昇格")
mustEqual(bird.Speak(), "ピヨ", "Speak() が Bird の定義")
mustEqual(bird.Fly(), "飛んだ", "Fly() が Bird 独自")
println("🎉 すべてのチェックが通りました")
✅ Passed: Name() が Animal から昇格 ✅ Passed: Speak() が Bird の定義 ✅ Passed: Fly() が Bird 独自
🎉 すべてのチェックが通りました
解説¶
type Bird struct { *Animal }—Animalを埋め込みます。これだけでbird.Name()はAnimal.Name()の昇格で呼べますfunc (b *Bird) Speak() string— 同じシグネチャのメソッドを定義することで、Animal.Speakを上書きしますfunc (b *Bird) Fly() string— Bird だけの新しいメソッドです。ここが「合成して部品を足す」の「足す」部分
Dog / Cat / Bird はすべて「Animal という部品を持つ」だけの関係で、継承ツリーを深くしません。
追加の動物を増やしたくなったら、新しい型を作って Animal を埋め込めば良いだけです。