Implementowanie interfejsu
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 14 z 68.
Skoro wiesz już, jak definiować interfejs, nauczmy się, jak typy Go faktycznie je implementują. Najważniejsze, co trzeba zrozumieć, to fakt, że Go używa niejawnej implementacji — nie jest potrzebne żadne specjalne słowo kluczowe ani deklaracja.
Jeśli typ ma wszystkie metody wymagane przez interfejs, automatycznie go spełnia. Nie musisz wyraźnie deklarować, że twój typ implementuje interfejs — Go ustala to za ciebie.
Oto jak to działa z interfejsem Shaper z poprzedniej lekcji:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Ponieważ typ Circle ma metodę Area(), która zwraca wartość typu float64, automatycznie implementuje interfejs Shaper. Nie trzeba jawnie deklarować tej relacji — Go rozpoznaje ją na podstawie zgodności sygnatury metody.
To niejawne podejście sprawia, że interfejsy Go są niezwykle elastyczne. Każdy istniejący typ może spełniać wymagania nowego interfejsu, o ile ma wymagane metody, nawet jeśli interfejs został utworzony po napisaniu typu.
Wyzwanie
ŁatwyW tym wyzwaniu przećwiczysz implementowanie interfejsu, tworząc prosty system pojazdów. Utworzysz strukturę Car, która automatycznie implementuje interfejs Vehicle dzięki niejawnemu implementowaniu w Go.
Otrzymasz dwa wejścia:
- Ciąg znaków reprezentujący markę samochodu (np.
"Toyota") - Ciąg znaków reprezentujący prędkość samochodu w km/h (np.
"120")
Twoim zadaniem jest:
- Zdefiniować interfejs
Vehiclez jedną sygnaturą metody:GetInfo(), która zwraca ciąg znaków - Zdefiniować strukturę
Carz dwoma polami:Brand(string) iSpeed(int) - Zaimplementować metodę
GetInfo()dla strukturyCar, która zwraca ciąg znaków w formacie:"Brand: [brand], Speed: [speed] km/h" - Przetworzyć dane wejściowe, aby utworzyć instancję
Car - Wywołać metodę
GetInfo()i wypisać wynik
Pamiętaj, że w Go struktura Car automatycznie zaimplementuje interfejs Vehicle, ponieważ ma wymaganą metodę GetInfo() o prawidłowej sygnaturze. Nie trzeba jawnie deklarować, że Car implementuje Vehicle — Go rozpoznaje tę zależność niejawnie.
Spróbuj swoich sił
package main
import (
"fmt"
"strconv"
)
// TODO: 1. Zdefiniuj interfejs Vehicle z metodą GetInfo() zwracającą string
// TODO: 2. Zdefiniuj strukturę Car z polami Brand (string) i Speed (int)
// TODO: 3. Zaimplementuj metodę GetInfo() dla Car
func main() {
// Wczytaj dane wejściowe
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// Przekonwertuj ciąg znaków reprezentujący prędkość na liczbę całkowitą
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. Utwórz instancję Car, używając brand i speed, a następnie wywołaj GetInfo()
result := "" // zastąp tę linię własną implementacją
_ = brand
_ = speed
// Wyświetl wynik
fmt.Println(result)
}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