Kurzusok
/
Go
Go
/
Feladatok
/
Repülőtéri robot
Repülőtéri robot

Repülőtéri robot

Tanulófeladat

Bevezetés

Az interfész mint metódushalmaz

A legegyszerűbb formájában az interfésztípus metódusszignatúrák halmaza. Íme egy példa egy interfészdefinícióra, amely két metódust tartalmaz, Add-ot és Value-t:

type Counter interface {
    Add(increment int)
    Value() int
}

Az olyan paraméternevek, mint az increment, elhagyhatók az interfészdefinícióból, de gyakran növelik az olvashatóságot.

A Go-ban az interfésznevek nem tartalmazzák az Interface vagy az I szót. Ehelyett gyakran er-re végződnek, például Reader, Stringer.

Interfész megvalósítása

Minden típus, amely definiálja az interfész metódusait, automatikusan, implicit módon „megvalósítja” az interfészt. A Go-ban nincs implements kulcsszó.

A következő típus valósítja meg a fentebb látott Counter interfészt.

type Stats struct {
    value int
    // ...
}

func (s Stats) Add(v int) {
    s.value += v
}

func (s Stats) Value() int {
    return s.value
}

func (s Stats) SomeOtherMethod() {
    // The type can have additional methods not mentioned in the interface.
}

Az interfész megvalósítása szempontjából nem számít, hogy a metódusnak érték vagy pointer receiver-e van. (Nézd át a metódusokkal kapcsolatos fogalmakat, ha bizonytalan vagy ezekben.)

Az interfésztípusú érték bármilyen értéket tárolhat, amely megvalósítja ezeket a metódusokat. [^1]

Ez azt jelenti, hogy a Stats mostantól mindenhol használható, ahol a Counter interfészt várják.

func SetUpAnalytics(counter Counter) {
    // ...
}

stats := Stats{}
SetUpAnalytics(stats)
// works because Stats implements Counter

Mivel az interfészek implicit módon valósulnak meg, egy típus könnyedén megvalósíthat több interfészt is. Ehhez csak az összes szükséges metódust kell definiálnia.

Az üres interfész

A Go-ban van egy nagyon különleges interfésztípus, az üres interfész, amely nulla metódust tartalmaz. Az üres interfészt így írjuk: interface{}. Az any az interface{} aliasa, és gyakrabban használják.

Mivel az üres interfésznek nincsenek metódusai, minden típus implicit módon megvalósítja. Ez hasznos olyan függvény definiálásához, amely általánosan bármilyen értéket elfogadhat. Ebben az esetben a függvény paramétere az üres interfésztípust használja.

Utasítások

A berlini új repülőtér fejlesztőket vett fel a robotlaborjába, és te most kezded ott a munkádat. Vannak esetlen, némileg humanoid külsejű robotjaik, amelyekkel az ügyfélszolgálatot próbálják javítani.

Az első feladatod a munkádban, hogy írj egy programot, amellyel a robot az anyanyelvükön köszöntheti az embereket, miután beszkennelték az útlevelüket az önkiszolgáló check-in pultnál.

A robot büszke a képességeire, ezért mindig először megmondja, milyen nyelven tud beszélni, majd köszönti a személyt. Ha például valaki egy német útlevelet szkennel be, a robot ezt mondaná:

I can speak German: Hallo Dietrich!

1. Hozd létre az absztrakt köszöntési funkcionalitást

A különböző nyelvek kódját nem te fogod megírni, ezért úgy kell felépítened a robot kódját, hogy más fejlesztők később könnyedén hozzáadhassanak további nyelveket.

Első lépésként definiálj egy Greeter interfészt két metódussal.

  • LanguageName, amely visszaadja annak a nyelvnek a nevét (egy string), amelyen a robotnak köszöntenie kell a látogatót.
  • Greet, amely elfogadja a látogató nevét (egy string), és visszaad egy string-et a megfelelő nyelvű köszöntő üzenettel.

Ezután implementálj egy SayHello függvényt, amely argumentumként elfogadja a látogató nevét és bármit, ami megvalósítja a Greeter interfészt, és visszaadja a kívánt köszöntő szöveget. Képzelj el például egy német Greeter implementációt, amelynél a LanguageName a "German", a Greet pedig a "Hallo {name}!" értéket adja vissza:

SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"

2. Valósítsd meg az olaszt

Most az a feladatod, hogy a robot azokkal is működjön, akik olasz útlevelet szkennelnek be.

Ehhez hozz létre egy Italian structot, és valósítsd meg azt a két metódust, amelyekre a structnak szüksége van ahhoz, hogy megfeleljen az 1. részfeladatban létrehozott Greeter interfésznek. Olaszul a "Ciao {name}!" szöveggel köszönthetsz valakit.

3. Valósítsd meg a portugált

Mielőtt leteszed a munkát mára, be kell fejezned azt a funkcionalitást is, amellyel portugálul köszöntheted az embereket.

Ehhez hozz létre egy Portuguese structot, és itt is valósítsd meg azt a két metódust, amelyekre a structnak szüksége van ahhoz, hogy megfeleljen a Greeter interfésznek. Portugálul a "Olá {name}!" szöveggel köszönthetsz valakit.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Go Exercism

Készen állsz elkezdeni a(z) Repülőtéri robot feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom166 feladat segítségével, valódi emberi mentorálással, mindez ingyen.