← Go コース
25. 構造体の埋め込み — 継承ではなくコンポジション
Go にはクラスの継承がありません。代わりに、構造体の中に別の型をフィールド名なしで書く「埋め込み(embedding)」で機能を組み合わせます。type Dog struct { Animal; Name string } のように書くと、Dog は Animal を内包し、Animal のフィールドやメソッドを d.Name のように自分のものであるかのように直接呼び出せます。これをフィールドの昇格(promotion)と呼びます。
埋め込みは「is-a(である)」ではなく「has-a(持っている)」の関係を組み立てるコンポジションです。継承のような階層を作るのではなく、必要な部品を寄せ集めて型を構成する、という発想です。埋め込んだ型のフィールドには d.Animal.Legs のように明示的にもアクセスでき、同名のフィールドがあるときは外側が優先されます。
メソッドも同様に昇格されるため、埋め込んだ型が持つメソッドを外側の型がそのまま使えるようになります。これにより、共通の振る舞いを一つの型に持たせて複数の型で再利用する、という設計が自然に書けます。継承の代わりにコンポジションを使うのが Go らしい組み立て方です。
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Go