インターフェースの定義
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を使用しませんが、それで問題ありません。Goでは、どの型にも実装されていない場合でもインターフェースをコンパイルできます。print文は、指定されたアクションに対してインターフェースが要求するメソッドシグネチャを表示するだけです。次のレッスンでは、MediaPlayerを実装する型を作成し、そのメソッドを呼び出します。
メソッド名は、インターフェース定義の一部であるため、大文字で始める(エクスポートする)必要があります。入力が"play"の場合は"MediaPlayer interface requires: Play() string"を、"pause"の場合は"MediaPlayer interface requires: Pause() string"を、"stop"の場合は"MediaPlayer interface requires: Stop() string"を出力します。
このチャレンジでは、メソッドシグネチャを使ってインターフェースを定義するという基本的な概念と、実装するすべての型が満たすべき契約の確立に焦点を当てます。
自分で試してみよう
package main
import "fmt"
func main() {
// 入力を読み取る
var action string
fmt.Scanln(&action)
// TODO: ここでMediaPlayerインターフェースを定義する
// TODO: 以下に、actionを処理して必要な出力を表示するコードを書く
// 結果を表示する
// 次の形式で表示すること: "MediaPlayer interface requires: [MethodName]() string"
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ