まとめ:図形と振る舞い
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 19/68。
チャレンジ
簡単このチャレンジでは、インターフェースを通じてポリモーフィズムを実証する通信システムを作成します。Speaker インターフェースを構築し、それぞれ独自の方法で「話す」ことができる異なる型でそれを実装します。
3つの入力を受け取ります:
- 作成するスピーカーの数(例:
"3") - カンマで区切られたスピーカーのタイプ(例:
"person,parrot,person") - カンマで区切られたスピーカーの名前(例:
"Alice,Polly,Bob")
あなたのタスクは以下の通りです:
- 1つのメソッドシグネチャ
Speak()(文字列を返す)を持つSpeakerインターフェースを定義する Nameフィールド(文字列)を持つPerson構造体を定義するNameフィールド(文字列)を持つParrot構造体を定義する- 両方の構造体に
Speak()メソッドを実装する:- Person は
"Hello, I'm [name]"を返す必要があります - Parrot は
"Squawk! [name] says hello!"を返す必要があります
- Person は
Speakerインターフェースのスライスをパラメータとして受け取るmakeAllSpeakという関数を作成するmakeAllSpeakの内部で、スライスを反復処理し、各スピーカーのSpeak()メソッドを呼び出して、その結果を出力する- 入力を解析して、提供されたタイプと名前に基づいて適切なスピーカーのインスタンスを作成する
- すべてのスピーカーを
Speakerインターフェースのスライスに格納する - 作成したスピーカーのスライスを使用して
makeAllSpeakを呼び出す
スピーカーは、入力に現れる順序で作成する必要があります。例えば、タイプが "person,parrot,person" で名前が "Alice,Polly,Bob" の場合、Alice という名前の Person、次に Polly という名前の Parrot、最後に Bob という名前の Person を作成します。このチャレンジは、共通のインターフェースを通じて異なる型を均一に扱う方法を示し、Go におけるポリモーフィズムの強力さを実証します。
自分で試してみよう
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// 入力を読み込む
var numSpeakersStr string
var speakerTypesStr string
var speakerNamesStr string
fmt.Scanln(&numSpeakersStr)
fmt.Scanln(&speakerTypesStr)
fmt.Scanln(&speakerNamesStr)
// 入力をパースする
numSpeakers, _ := strconv.Atoi(numSpeakersStr)
speakerTypes := strings.Split(speakerTypesStr, ",")
speakerNames := strings.Split(speakerNamesStr, ",")
// TODO: 以下にコードを記述してください
// 1. Speaker インターフェースを定義する
// 2. Person と Parrot 構造体を定義する
// 3. 両方の構造体に Speak() メソッドを実装する
// 4. makeAllSpeak 関数を作成する
// 5. 入力に基づいてスピーカーを作成し、スライスに保存する
// 6. 作成したスライスを使用して makeAllSpeak を呼び出す
}