インターフェースの定義
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 13/68。
インターフェースが概念的に何であるかを理解できたので、次はGoで実際にインターフェースを定義する方法を学びましょう。インターフェースは、interfaceキーワードに続けて、中かっこで囲んだメソッドシグネチャの集合を記述して定義します。
インターフェースを定義する基本構文は次のとおりです。
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}interface にはメソッドシグネチャ(メソッド名、パラメーター、戻り値の型)のみが含まれ、実装は含まれないことに注意してください。interface は、これらのメソッドがどのように動作すべきかを指定するのではなく、どのメソッドが存在しなければならないかだけを指定します。
たとえば、実装する任意の type に Area メソッドを要求する、シンプルな Shaper interface を定義する方法は次のとおりです。
type Shaper interface {
Area() float64
}このインターフェースは契約を定めています。Shaper として扱われることを望む型は、パラメーターを受け取らず、float64 を返す Area メソッドを持たなければなりません。インターフェースは、その型が何であるかや、面積をどのように計算するかを気にしません。正しいシグネチャでメソッドが存在することだけを確認します。
チャレンジ
簡単このチャレンジでは、シンプルなメディアプレーヤーシステムを作成しながら、Goでインターフェースを定義する練習をします。異なる種類のメディアデバイスに対する契約を定めるインターフェースを定義します。
入力は1つ与えられます。
- メディアアクションを表す文字列(例:
"play"、"pause"、または"stop")
あなたのタスクは次のとおりです。
MediaPlayerという名前のインターフェースを定義し、3つのメソッドシグネチャを含めます。- 文字列を返す
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"を出力します。
このチャレンジでは、メソッドシグネチャを使ってインターフェースを定義し、実装する型が満たすべき契約を確立するという基本概念に焦点を当てます。
自分で試してみよう
package main
import "fmt"
func main() {
// 入力を読み取る
var action string
fmt.Scanln(&action)
// TODO: Define your MediaPlayer interface here
// TODO: アクションを処理し、必要な出力を表示するコードを以下に書いてください
// 結果を出力する
// Remember to print in format: "MediaPlayer interface requires: [MethodName]() string"
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ