Sobes.tech
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:

  1. 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
    }
    
  2. 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.