Menu
Coddy logo textTech

インターフェースの実装

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のインターフェースは非常に柔軟になります。必要なメソッドを持っている限り、既存の型は新しいインターフェースを満たすことができます。たとえそのインターフェースが型の作成後に定義されたものであっても同様です。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

challenge icon

チャレンジ

簡単

このチャレンジでは、シンプルな車両システムを作成することで、インターフェースの実装を練習します。Goの暗黙的な実装を通じて、Vehicleインターフェースを自動的に実装するCar構造体を作成します。

2つの入力を受け取ります:

  • 車のブランドを表す文字列(例:"Toyota"
  • 車の時速(km/h)を表す文字列(例:"120"

あなたのタスクは以下の通りです:

  1. 文字列を返す1つのメソッドシグネチャGetInfo()を持つVehicleインターフェースを定義する
  2. 2つのフィールド、Brand(string)とSpeed(int)を持つCar構造体を定義する
  3. Car構造体にGetInfo()メソッドを実装し、"Brand: [brand], Speed: [speed] km/h"という形式の文字列を返すようにする
  4. 入力を解析してCarインスタンスを作成する
  5. GetInfo()メソッドを呼び出し、結果を出力する

Goでは、Car構造体が必要なシグネチャを持つGetInfo()メソッドを持っているため、自動的にVehicleインターフェースを実装することに注意してください。CarVehicleを実装することを明示的に宣言する必要はありません。Goはこの関係を暗黙的に認識します。

チートシート

Goはインターフェースに対して暗黙的な実装を使用します。特別なキーワードや宣言は必要ありません。

ある型がインターフェースの要求するすべてのメソッドを持っている場合、その型は自動的にそのインターフェースを満たします。

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

Circlefloat64を返す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)
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン