インターフェースの実装
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 14/68。
インターフェースの定義方法がわかったところで、Goの型が実際にどのようにそれらを実装するのかを学びましょう。理解すべき最も重要なことは、Goが暗黙的な実装を使用しているということです。特別なキーワードや宣言は必要ありません。
ある型がインターフェースが必要とするすべてのメソッドを持っている場合、その型は自動的にそのインターフェースを満たします。型がインターフェースを実装していることを明示的に宣言する必要はありません。Goがこれを自動的に判断します。
前のレッスンの Shaper インターフェースでの動作は次のようになります:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Circle 型は float64 を返す Area() メソッドを持っているため、自動的に Shaper インターフェースを実装します。この関係を明示的に宣言する必要はありません。Go はメソッドシグネチャの一致に基づいてそれを認識します。
この暗黙的なアプローチにより、Goのインターフェースは非常に柔軟になります。必要なメソッドを持っている限り、既存の型は新しいインターフェースを満たすことができます。たとえそのインターフェースが型の作成後に定義されたものであっても同様です。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単このチャレンジでは、シンプルな車両システムを作成することで、インターフェースの実装を練習します。Goの暗黙的な実装を通じて、Vehicleインターフェースを自動的に実装するCar構造体を作成します。
2つの入力を受け取ります:
- 車のブランドを表す文字列(例:
"Toyota") - 車の時速(km/h)を表す文字列(例:
"120")
あなたのタスクは以下の通りです:
- 文字列を返す1つのメソッドシグネチャ
GetInfo()を持つVehicleインターフェースを定義する - 2つのフィールド、
Brand(string)とSpeed(int)を持つCar構造体を定義する Car構造体にGetInfo()メソッドを実装し、"Brand: [brand], Speed: [speed] km/h"という形式の文字列を返すようにする- 入力を解析して
Carインスタンスを作成する GetInfo()メソッドを呼び出し、結果を出力する
Goでは、Car構造体が必要なシグネチャを持つGetInfo()メソッドを持っているため、自動的にVehicleインターフェースを実装することに注意してください。CarがVehicleを実装することを明示的に宣言する必要はありません。Goはこの関係を暗黙的に認識します。
チートシート
Goはインターフェースに対して暗黙的な実装を使用します。特別なキーワードや宣言は必要ありません。
ある型がインターフェースの要求するすべてのメソッドを持っている場合、その型は自動的にそのインターフェースを満たします。
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Circleはfloat64を返すArea()メソッドを持っているため、明示的な宣言なしに自動的にShaperインターフェースを実装します。
この暗黙的なアプローチにより、Goのインターフェースは柔軟になります。必要なメソッドを持っている限り、たとえそのインターフェースが型の後に作成されたとしても、既存の型は新しいインターフェースを満たすことができます。
自分で試してみよう
package main
import (
"fmt"
"strconv"
)
// TODO: 1. GetInfo() string メソッドを持つ Vehicle インターフェースを定義します
// TODO: 2. Brand (string) と Speed (int) フィールドを持つ Car 構造体を定義します
// TODO: 3. Car の GetInfo() メソッドを実装します
func main() {
// 入力を読み取ります
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// 速度の文字列を整数に変換します
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. brand と speed を使用して Car インスタンスを作成し、GetInfo() を呼び出します
result := "" // この行を実装に置き換えてください
_ = brand
_ = speed
// 結果を出力します
fmt.Println(result)
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。