メソッドプロモーション
埋め込みによってメソッドを継承します
「メソッドプロモーション」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
埋め込みによるメソッドの継承
型を埋め込むと、そのメソッドも昇格します。外側の型では、あたかも自分で定義したかのようにそれらを呼び出せます。これがGoにおける継承に近い仕組みです。
昇格したメソッド
CarはEngineを埋め込むことで、そのStartメソッドを自動的に使えるようになります。
package main
import "fmt"
type Engine struct{}
func (Engine) Start() { fmt.Println("engine started") }
type Car struct{ Engine }
func main() {
c := Car{}
c.Start()
}メソッドは埋め込まれた値に対して動作する
昇格したメソッドは外側の構造体ではなく、埋め込まれたフィールドに対して実行されます。外側の構造体にある他のフィールドを参照することはできません。
package main
import "fmt"
type Counter struct{ n int }
func (c *Counter) Inc() { c.n++ }
func (c Counter) Get() int { return c.n }
type Widget struct{ Counter }
func main() {
w := Widget{}
w.Inc()
w.Inc()
fmt.Println(w.Get())
}メソッドのオーバーライド
外側の構造体に同じ名前のメソッドを定義すると、昇格したメソッドをオーバーライドできます。外側のメソッドが優先されます。
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "..." }
type Dog struct{ Animal }
func (Dog) Speak() string { return "Woof" }
func main() {
fmt.Println(Dog{}.Speak())
}埋め込み元のメソッドを呼び出す
オーバーライドした後でも、埋め込み型の名前を使えば元のメソッドにアクセスできます。
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "generic" }
type Dog struct{ Animal }
func (d Dog) Speak() string { return "Woof + " + d.Animal.Speak() }
func main() {
fmt.Println(Dog{}.Speak())
}メソッドの昇格とインターフェース
昇格したメソッドは外側の型のメソッドセットに含まれるため、外側の型は埋め込み型のメソッドを使ってインターフェースを満たすことができます。
package main
import "fmt"
type Stringer interface{ String() string }
type Base struct{ name string }
func (b Base) String() string { return b.name }
type Wrapper struct{ Base }
func main() {
var s Stringer = Wrapper{Base{"hi"}}
fmt.Println(s.String())
}ポインタと値のメソッドセット
埋め込み型にポインタレシーバーのメソッドがある場合、それらのメソッドが外側の構造体のメソッドセットに昇格するのは、外側の構造体へのポインタ(またはアドレス取得可能な値)だけです。
デフォルトの振る舞いに埋め込みを使う
適切なデフォルトメソッドを提供する型を埋め込み、カスタマイズが必要な一部のメソッドだけをオーバーライドします。これは強力な再利用パターンです。
package main
import "fmt"
type DefaultHandler struct{}
func (DefaultHandler) Handle() string { return "default" }
type CustomHandler struct{ DefaultHandler }
func (CustomHandler) Handle() string { return "custom" }
func main() {
fmt.Println(CustomHandler{}.Handle())
}真のポリモーフィズムはない
古典的なOOPとは異なり、埋め込まれたメソッドが外側のオーバーライドへディスパッチし直すことはありません。Goでは、埋め込みを通じた仮想メソッドディスパッチは行われません。
複数レベルにわたる昇格
メソッドは推移的に昇格します。AがBを埋め込み、BがCを埋め込んでいる場合、名前の曖昧さがなければAはCのメソッドも取得します。
昇格が役立つ場面
- 振る舞いを書き直さずに再利用する
- オーバーライド可能なデフォルトを提供する
- 埋め込まれたメソッドによってインターフェースを満たす
クイックチェック
メソッドの昇格に関する知識を確認しましょう。
まとめ
メソッドの昇格を学びました。
- 埋め込まれたメソッドは外側の型に昇格します
- 外側のメソッドは昇格したメソッドをオーバーライドします
- 埋め込み型の名前を使って元のメソッドにアクセスできます
- 昇格によってインターフェースを満たせますが、仮想ディスパッチはありません
よくある質問
「メソッドプロモーション」レッスンは無料ですか?
はい。「メソッドプロモーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「メソッドプロモーション」で何を学びますか?
埋め込みによってメソッドを継承します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「メソッドプロモーション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造体の埋め込み
- インターフェースの埋め込み
- メソッドプロモーション
- 継承よりもコンポジション