Junior
Kuidas Golangis pärandamist rakendab?
sobes.tech AI
Vastus AI-lt
Go'l traditsiooniline klassipärandusüsteem puudub, nagu näiteks Java või C++-s. Selle asemel kasutatakse kahte mehhanismi:
-
Sisestamine (Embedding):
- Sisestamine võimaldab ühe struktuuri või tüübi sisestamist teise.
- Sisestatud tüüp "edastab" oma väljad ja meetodid sisestavale tüübile.
- Juurdepääs sisestatud tüübi väljadele ja meetoditele toimub otse, nagu need oleksid määratletud sisestavas tüübis.
- See jäljendab kompositsiooni, kuid mugavama juurdepääsusüntaksiga, sarnaselt pärimisele.
package main import "fmt" type Engine struct { Type string } func (e Engine) Start() { fmt.Println(e.Type, "mootor käivitus") } type Car struct { Engine // Engine struktuuri sisestamine Model string } func main() { car := Car{ Engine: Engine{Type: "V8"}, Model: "Mustang", } // Otse juurdepääs sisestatud struktuuri väljadele ja meetoditele fmt.Println("Auto mudel:", car.Model) car.Start() // Sisestatud struktuuri meetodi väljakutse } -
Liidesed (Interfaces):
- Liidesed määratlevad meetodite kogumi, mida tüüp peab rakendama.
- Nad määratlevad "käitumise", mitte andmestruktuuri.
- Tüüp ei pea otseselt deklarima, et ta rakendab liidest; piisab, kui ta rakendab kõiki liidese määratletud meetodeid.
- Liidesed võimaldavad polümorfismi.
package main import "fmt" type Speaker interface { Speak() } type Dog struct { Name string } func (d Dog) Speak() { fmt.Println(d.Name, "ütleb Woof!") } type Cat struct { Name string } func (c Cat) Speak() { fmt.Println(c.Name, "ütleb Meow!") } func main() { animals := []Speaker{ Dog{Name: "Buddy"}, Cat{Name: "Whiskers"}, } for _, animal := range animals { animal.Speak() // Polümorfne meetodi väljakutse } }
Kombinatsioon sisestamisest ja liidestest võimaldab Go-l saavutada paindlikkust ja koodi taaskasutust ilma keerukate ja probleemideta, mis on seotud traditsioonilise pärimisega (näiteks " teemant" probleem). Go eelistab kompositsiooni ja liideseid pärimishierarhia asemel.