Definiowanie interfejsu
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 13 z 68.
Skoro już wiesz, czym są interfejsy, nauczmy się, jak zdefiniować interfejs 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 jedynie 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żesz zdefiniować prosty interfejs Shaper, który wymaga, aby każdy implementujący go typ miał metodę Area:
type Shaper interface {
Area() float64
}Ten interfejs ustanawia umowę: każdy typ, który chce być uznawany za Shaper, musi mieć metodę Area, która nie przyjmuje żadnych parametrów i zwraca wartość typu float64. Interfejs nie dba o to, jaki to typ ani jak oblicza pole — liczy się tylko to, by istniała metoda o prawidłowej sygnaturze.
Wyzwanie
ŁatwyW tym wyzwaniu poćwiczysz definiowanie interfejsów w Go, tworząc prosty system odtwarzacza multimedialnego. Zdefiniujesz interfejs, który określa kontrakt dla różnych typów urządzeń multimedialnych.
Otrzymasz jedno wejście:
- Łańcuch znaków reprezentujący działanie odtwarzacza multimedialnego (np.
"play","pause"lub"stop")
Twoim zadaniem jest:
- Zdefiniować interfejs o nazwie
MediaPlayerz trzema sygnaturami metod:Play(), która zwraca łańcuch znakówPause(), która zwraca łańcuch znakówStop(), która zwraca łańcuch znaków
- Na podstawie działania podanego na wejściu wypisać odpowiednią sygnaturę metody z interfejsu
MediaPlayerw formacie:"MediaPlayer interface requires: [MethodName]() string"
Instrukcja wypisywania ma odzwierciedlać zdefiniowany wyżej interfejs. Opisujesz, jakiej sygnatury metody wymaga interfejs MediaPlayer dla danego działania. Możesz potraktować to tak, jakby program sprawdzał i opisywał własny kontrakt interfejsu.
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 z sygnaturami metod, które określają kontrakt, jaki 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