Go語言面向?qū)ο笕筇匦浴^承

Go語言里靠匿名結(jié)構(gòu)體實現(xiàn)繼承,嵌入到新的結(jié)構(gòu)體里面。如果一個struct嵌套了另一個匿名結(jié)構(gòu)體,那么這個結(jié)構(gòu)體可以直接訪問匿名結(jié)構(gòu)的字段和方法,從而實現(xiàn)繼承。名字不管大寫還是小寫都可以用。

package main

import "fmt"
//共同的結(jié)構(gòu)體
type Student struct {
    Name string
    Age int
    Score int

}


func (stu *Student) ShowInfo(){
    fmt.Printf("學生名字=%v,年齡=%v,成績=%v",stu.Name,stu.Age,stu.Score)
}

func (pu *Pupil) ShowInfo(){
    fmt.Printf("學生名字=%v,年齡=%v,成績=%v",pu.Name,pu.Age,pu.Score)
}
func (stu *Student) SetScore(score int ){
    stu.Score= score
}
//嵌入匿名結(jié)構(gòu)體
type Pupil struct {
    Student
    Name string

}

type Graduate struct {
    Student

}


func main()  {
    var pupil = &Pupil{}
    pupil.Student.Name="Tom"
    pupil.Student.Age = 8
    pupil.Student.SetScore(70)
    pupil.Student.ShowInfo()

    pupil.Name="Love"
    pupil.Age= 20
    pupil.SetScore(60)
    pupil.ShowInfo()
    pupil.Student.ShowInfo()
    fmt.Println(pupil.Name, pupil.Student.Name)
}

當結(jié)構(gòu)體和匿名結(jié)構(gòu)體有相同的字段或者方法時,編譯器采用就近訪問原則訪問,如果希望訪問匿名結(jié)構(gòu)體的字段和方法,通過匿名結(jié)構(gòu)體名字來訪問:

pupil.Student.Name="Tom" //訪問匿名結(jié)構(gòu)體Student

如果有有名結(jié)構(gòu)體,訪問其字段時,必須帶上其名字。

type Pupil struct {
    Stu Student
    Name string
}

func main()  {
    var pupil = &Pupil{}
    pupil.Stu.Name="Tom"S3
}

多重繼承

如果一個struct里嵌套多個匿名結(jié)構(gòu)體,

type Student struct {
    Name string
    Age int
    Score int

}
type People struct {
    Sex string

}

type Pupil struct {
    Student
    People
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容