Definiowanie interfejsu
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 13 z 68.
Teraz, gdy już rozumiesz, czym są interfejsy, poznajmy sposób ich definiowania w Go. Interfejs definiuje się za pomocą słowa kluczowego interface, po którym następuje zestaw sygnatur metod ujętych w nawiasy klamrowe.
Oto podstawowa składnia definiowania interfejsu:
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}Zauważ, że interfejs zawiera wyłącznie sygnatury metod — nazwę metody, parametry i typy zwracane — ale nie zawiera implementacji. Interfejs nie określa, jak te metody powinny działać, a jedynie jakie metody muszą istnieć.
Na przykład tak można zdefiniować prosty interfejs Shaper, który wymaga, aby każdy implementujący go typ miał metodę Area:
type Shaper interface {
Area() float64
}Ten interfejs określa kontrakt: każdy typ, który ma być uznawany za Shaper, musi mieć metodę Area, która nie przyjmuje żadnych parametrów i zwraca wartość typu float64. Interfejs nie interesuje się tym, jaki to typ ani jak oblicza pole — liczy się tylko to, że istnieje metoda o odpowiedniej sygnaturze.
Wyzwanie
ŁatwyW tym wyzwaniu poćwiczysz definiowanie interfejsów w Go, tworząc prosty system odtwarzacza multimedialnego. Zdefiniujesz interfejs, który ustanawia kontrakt dla różnych typów urządzeń multimedialnych.
Otrzymasz jedno wejście:
- Ciąg znaków reprezentujący akcję multimedialną (np.
"play","pause"lub"stop")
Twoim zadaniem jest:
- Zdefiniować interfejs o nazwie
MediaPlayerz trzema sygnaturami metod:Play(), która zwraca ciąg znakówPause(), która zwraca ciąg znakówStop(), która zwraca ciąg znaków
- Na podstawie wejściowej akcji wypisać odpowiednią sygnaturę metody z interfejsu
MediaPlayerw formacie:"MediaPlayer interface requires: [MethodName]() string"
Ten program na razie nie używa MediaPlayer i to jest w porządku: Go kompiluje interfejs nawet wtedy, gdy żaden typ go nie implementuje. Instrukcje print po prostu informują o sygnaturze metody wymaganej przez twój interfejs dla danej akcji. W następnej lekcji utworzysz typ, który implementuje MediaPlayer, i wywołasz jego metody.
Nazwy metod powinny zaczynać się wielką literą (być eksportowane), ponieważ są częścią definicji interfejsu. Dla wejścia "play" wypisz "MediaPlayer interface requires: Play() string", dla "pause" wypisz "MediaPlayer interface requires: Pause() string", a dla "stop" wypisz "MediaPlayer interface requires: Stop() string".
To wyzwanie skupia się na podstawowej koncepcji definiowania interfejsów za pomocą sygnatur metod, ustanawiających kontrakt, który musi spełnić każdy typ implementujący dany interfejs.
Spróbuj swoich sił
package main
import "fmt"
func main() {
// Odczytaj dane wejściowe
var action string
fmt.Scanln(&action)
// TODO: Zdefiniuj tutaj interfejs MediaPlayer
// TODO: Napisz poniżej kod, który obsłuży action i wypisze wymagany wynik
// Wypisz wynik
// Pamiętaj, aby wypisać wynik w formacie: "MediaPlayer interface requires: [MethodName]() string"
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online