インターフェースの定義
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 13/68。
インターフェースが概念的にどのようなものであるかを理解したところで、実際に Go でインターフェースを定義する方法を学びましょう。インターフェースは、interface キーワードに続けて、波括弧で囲まれた一連のメソッドシグネチャを使用して定義されます。
インターフェースを定義するための基本的な構文は次のとおりです。
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}インターフェースには、メソッド名、パラメータ、戻り値の型といったメソッドのシグネチャのみが含まれ、実装は含まれないことに注意してください。インターフェースは、これらのメソッドがどのように動作すべきかを指定するのではなく、どのメソッドが存在しなければならないかのみを指定します。
例えば、実装する型に Area メソッドを持つことを要求する、単純な Shaper インターフェースを定義する方法は次のとおりです。
type Shaper interface {
Area() float64
}このインターフェースはコントラクト(契約)を確立します。Shaper と見なされるすべての型は、引数を取らずに float64 を返す Area メソッドを実装している必要があります。インターフェースはその型が何であるか、あるいはどのように面積を計算するかは問いません。ただ、正しいシグネチャを持つメソッドが存在することだけを要求します。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単このチャレンジでは、シンプルなメディアプレーヤーシステムを作成することで、Go言語でのインターフェース定義を練習します。さまざまな種類のメディアデバイスのコントラクト(規約)を確立するインターフェースを定義します。
1つの入力を受け取ります:
- メディアアクションを表す文字列(例:
"play"、"pause"、または"stop")
あなたのタスクは以下の通りです:
- 3つのメソッドシグネチャを持つ
MediaPlayerという名前のインターフェースを定義します:- 文字列を返す
Play() - 文字列を返す
Pause() - 文字列を返す
Stop()
- 文字列を返す
- 入力されたアクションに基づいて、
MediaPlayerインターフェースの対応するメソッドシグネチャを、"MediaPlayer interface requires: [MethodName]() string"という形式で出力します。
この出力文は、上記で定義したインターフェースを反映させるためのものです。つまり、指定されたアクションに対して MediaPlayer インターフェースがどのメソッドシグネチャを要求しているかを説明します。プログラムが自身のインターフェース規約を検査し、報告していると考えてください。
メソッド名はインターフェース定義の一部であるため、大文字で始める(エクスポートする)必要があります。入力が "play" の場合は "MediaPlayer interface requires: Play() string" を、"pause" の場合は "MediaPlayer interface requires: Pause() string" を、"stop" の場合は "MediaPlayer interface requires: Stop() string" を出力してください。
このチャレンジは、メソッドシグネチャを使用してインターフェースを定義し、実装する型が満たさなければならない規約を確立するという基本概念に焦点を当てています。
チートシート
インターフェースは、interface キーワードを使用し、その後に波括弧で囲まれたメソッドシグネチャを記述して定義します:
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}インターフェースにはメソッドシグネチャ(名前、パラメータ、戻り値の型)のみが含まれ、実装は含まれません:
type Shaper interface {
Area() float64
}インターフェース内のすべてのメソッドを実装する型は、自動的にそのインターフェースの規約を満たします。
自分で試してみよう
package main
import "fmt"
func main() {
// 入力を読み込む
var action string
fmt.Scanln(&action)
// TODO: ここでMediaPlayerインターフェースを定義してください
// TODO: アクションを処理し、必要な出力を出力するためのコードを以下に記述してください
// 結果を出力する
// 次の形式で出力することを忘れないでください: "MediaPlayer interface requires: [MethodName]() string"
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。