Sobes.tech
Junior

Ինչպես է Golang-ում ժառանգությունը իրականացվում?

sobes.tech AI

Պատասխան AI-ից

Go-ում ավանդական դասի ժառանգությունը չկա, ինչպես օրինակ Java կամ C++-ում: Փոխարենը օգտագործվում են երկու մեխանիզմներ՝

  1. Ներառում (Embedding):

    • Ներառումը թույլ է տալիս ներդնել մեկ կառուցվածք կամ տիպ մյուսի մեջ:
    • Ներառված տիպը "փոխանցում" է իր դաշտերը և մեթոդները ներառող տիպին:
    • Ներառված տիպի դաշտերին և մեթոդներին հասանելիությունը կատարվում է ուղղակի, կարծես դրանք սահմանված լինեին ներառող տիպում:
    • Սա իմիտացիա է կոմպոզիցիայի, բայց ավելի հարմարեցված մուտքագրման սինտաքսով, ինչպես ժառանգության դեպքում:
    package main
    
    import "fmt"
    
    type Engine struct {
        Type string
    }
    
    func (e Engine) Start() {
        fmt.Println(e.Type, "մոտորակ սկսվեց")
    }
    
    type Car struct {
        Engine // Ներառում է Engine կառուցվածքը
        Model  string
    }
    
    func main() {
        car := Car{
            Engine: Engine{Type: "V8"},
            Model:  "Mustang",
        }
    
        // Ներառված կառուցվածքի դաշտին և մեթոդին ուղղակի հասանելիություն
        fmt.Println("Ավտոմեքենայի մոդելը:", car.Model)
        car.Start() // Ներառված կառուցվածքի մեթոդի կանչ
    }
    
  2. Ինտերֆեյսներ:

    • Ինտերֆեյսները սահմանում են մեթոդների հավաքածու, որոնք պետք է իրականացնել տիպը:
    • Նրանք սահմանում են "գործողություն", ոչ թե տվյալների կառուցվածք:
    • Տիպը պետք է միայն իրականացնել բոլոր մեթոդները, որոնք սահմանված են ինտերֆեյսում, առանց բացահայտ հայտարարելու, որ այն իրականացնում է այդ ինտերֆեյսը:
    • Ինտերֆեյսները ապահովում են պոլիմորֆիզմ:
    package main
    
    import "fmt"
    
    type Speaker interface {
        Speak()
    }
    
    type Dog struct {
        Name string
    }
    
    func (d Dog) Speak() {
        fmt.Println(d.Name, "ասում է Woof!")
    }
    
    type Cat struct {
        Name string
    }
    
    func (c Cat) Speak() {
        fmt.Println(c.Name, "ասում է Meow!")
    }
    
    func main() {
        animals := []Speaker{
            Dog{Name: "Buddy"},
            Cat{Name: "Whiskers"},
        }
    
        for _, animal := range animals {
            animal.Speak() // Պոլիմորֆիկ կանչ
        }
    }
    

Կոմբինացիան ներառման և ինտերֆեյսների թույլ է տալիս Go-ին հասնել ճկունության և կոդի կրկնվող օգտագործման առանց ժառանգության դասավորությունների բարդությունների և խնդիրների, ինչպես օրինակ "դիամանտ" խնդիրը: Go-ում գերադասվում է կոմպոզիցիան և ինտերֆեյսները ժառանգության հիերարխիաների փոխարեն։