首頁 > 後端開發 > Golang > golang怎麼繼承

golang怎麼繼承

王林
發布: 2023-05-22 15:25:07
原創
927 人瀏覽過

在Go語言中,沒有傳統物件導向語言中所定義的“類別”,因此不存在所謂的“繼承”。但是,Go語言提供了一種透過組合實現類似繼承的方法,稱為嵌入(Embedding)。

嵌入可以讓我們將一個類型嵌入到另一個類型中,這樣被嵌入的類型就可以直接存取嵌入它的類型的屬性和方法,而無需透過介面或其他方式來存取。這個過程類似於傳統的“繼承”,但是更加靈活。

下面,我們將透過幾個例子來示範如何使用嵌入實作類似繼承的功能。

  1. 基礎範例

我們先定義幾個基礎的結構體,狗、貓和人:

type Dog struct {
    name string
}

func (d Dog) Bark() {
    fmt.Println(d.name, ": 汪汪汪!")
}

type Cat struct {
    name string
}

func (c Cat) Mew() {
    fmt.Println(c.name, ": 喵喵喵!")
}

type Person struct {
    name string
}

func (p Person) Speak() {
    fmt.Println(p.name, ": 你好!")
}
登入後複製

現在我們要建立一個動物類型,它可以「繼承」狗和貓,並且還有自己的屬性和方法,例如顏色和奔跑的速度。我們可以這樣定義:

type Animal struct {
    Dog
    Cat
    color       string
    runSpeed    int
}

func (a Animal) Run() {
    fmt.Println(a.color, "的动物以", a.runSpeed, "km/h的速度奔跑!")
}
登入後複製

在這個定義中,Animal型別嵌入了Dog和Cat型別。這意味著Animal類型實例化的物件可以直接存取Dog和Cat類型的屬性和方法。我們也可以為Animal類型定義自己的屬性和方法,例如color和runSpeed,用來表示動物的顏色和奔跑的速度,並定義一個Run方法來描述動物的奔跑動作。

現在我們來建立一個Animal對象,看看它是如何運作的:

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    a.Bark()    // 小黑 : 汪汪汪!
    a.Mew()     // 小白 : 喵喵喵!
    a.Run()     // 黑白相间 的动物以 50 km/h的速度奔跑!
}
登入後複製

我們可以看到,透過嵌入Dog和Cat類型,Animal物件可以直接呼叫Bark和Mew方法,而無需使用介面或其他方式。這種方式可以讓我們在不使用傳統意義上的「繼承」情況下實現類似的功能。

  1. 嵌入自訂類型

我們可以將一個自訂類型嵌入到另一個自訂類型中,實現類似繼承的效果。現在,我們來定義一個Person類型和一個Student類型,並將Person類型嵌入到Student類型中:

type Person struct {
    name string
    age  int
    sex  string
}

type Student struct {
    Person
    class string
    score float64
}
登入後複製

在這個定義中,Student類型嵌入了Person類型。實例化Student類型物件的時候,可以使用Person的屬性和方法。例如,我們可以實例化一個學生對象,設定他的姓名、年齡、性別、班級和成績:

func main() {
    s := Student{
        Person: Person{
            name: "小明",
            age:  18,
            sex:  "男",
        },
        class: "高三一班",
        score: 92.5,
    }
    fmt.Println("姓名:", s.name)
    fmt.Println("年龄:", s.age)
    fmt.Println("性别:", s.sex)
    fmt.Println("班级:", s.class)
    fmt.Println("成绩:", s.score)
}
登入後複製

當我們執行這個程式時,可以看到輸出如下:

姓名: 小明
年龄: 18
性别: 男
班级: 高三一班
成绩: 92.5
登入後複製

我們可以看到,Student物件可以直接存取Person類型物件的屬性和方法,包括name、age和sex等屬性。

  1. 嵌套嵌入

在一個類型中嵌套多個類型也是可以的。我們可以將Animal類型嵌入到另一個類型中,來實現更多的功能。例如,我們現在來定義一個Zoo類型:

type Zoo struct {
    Animal
    name    string
    address string
}

func (z Zoo) ShowInfo() {
    fmt.Println("这是", z.name, ", 地址是", z.address)
    z.Run()
}
登入後複製

在這個類型的定義中,我們將Animal類型嵌入到Zoo類型中。這樣,Zoo型別可以直接存取Animal類型的屬性和方法,包括Run方法。我們再定義一個ShowInfo方法來輸出動物園的名稱和位址,並且呼叫Animal類型的Run方法來展示動物們的奔跑。

現在,我們創建一個動物園對象,並測試它的方法:

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    z := Zoo{a, "北京动物园", "北京市海淀区清华科技园路"}
    z.ShowInfo()
}
登入後複製

當我們運行這個程式時,可以看到輸出如下:

这是 北京动物园 , 地址是 北京市海淀区清华科技园路
黑白相间 的动物以 50 km/h的速度奔跑!
登入後複製

我們可以看到,透過將Animal類型嵌套到Zoo類型中,我們可以創造出具有更多功能的類型,可以展示動物園的資訊和動物們的奔跑動作。

總結

雖然在Go語言中沒有傳統物件導向語言所定義的類別和繼承的概念,但是嵌入的概念可以讓我們在不使用傳統的繼承方式的情況下,實現類似的功能,更加靈活方便。透過以上的例子,我們可以看到,嵌入可以輕鬆建立一個包含子類型的類型,並且可以方便地呼叫它們的方法和屬性。

以上是golang怎麼繼承的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板