日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Go語(yǔ)言使用組合的思想實(shí)現(xiàn)繼承_Golang

作者:陳明勇 ? 更新時(shí)間: 2023-01-15 編程語(yǔ)言

前言

  • Go 語(yǔ)言的設(shè)計(jì)之初,就不打算支持面向?qū)ο蟮木幊烫匦裕虼?Go 不支持面向?qū)ο蟮娜筇匦灾弧^承。但是 Go 可以通過(guò)組合的思想去實(shí)現(xiàn) “繼承”。
  • 繼承是面向?qū)ο蟮娜筇匦灾唬^承是從已有的類(lèi)中派生出新的類(lèi),新的類(lèi)能吸收已有類(lèi)的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。
  • Go 語(yǔ)言里的“繼承”體現(xiàn)如一個(gè)結(jié)構(gòu)體擁有另一個(gè)結(jié)構(gòu)體的的所有字段和方法,并在此基礎(chǔ)上,定義新的字段和方法。

類(lèi)型嵌入

組合的思想,在 Go 語(yǔ)言里的體現(xiàn)就是類(lèi)型嵌入。類(lèi)型嵌入,指的是一個(gè)類(lèi)型的定義里嵌入了其他類(lèi)型。類(lèi)型嵌入包含兩種,一種是結(jié)構(gòu)體類(lèi)型嵌入,另一種是接口類(lèi)型嵌入。

結(jié)構(gòu)體類(lèi)型嵌入

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p Person) Introduce() {
    fmt.Printf("大家好,我叫%s,我今年%d歲了。\n", p.Name, p.Age)
}

type Student struct {
    Person
    School string
}

func (s Student) GoToTheClass() {
    fmt.Println("去上課...")
}

func main() {
    student := Student{}
    student.Name = "小明"
    student.Age = 18
    student.School = "太陽(yáng)系大學(xué)"

    // 執(zhí)行 Person 類(lèi)型的 Introduce 方法
    student.Introduce()
    // 執(zhí)行自身的 GoToTheClass 方法
    student.GoToTheClass()
}

執(zhí)行結(jié)果:

大家好,我叫小明,我今年18歲了。
去上課...

  • 定義 Person 結(jié)構(gòu)體,包含 NameAge 字段以及 Introduce 方法。
  • 定義 Student 結(jié)構(gòu)體,定義 School 字段,GoToTheClass 方法,嵌入 Person 類(lèi)型,直接以結(jié)構(gòu)體類(lèi)型作為結(jié)構(gòu)體的字段,稱為 結(jié)構(gòu)體的類(lèi)型嵌入,此字段也被視為 字段嵌入
  • 創(chuàng)建 Student 變量 student,通過(guò) student 訪問(wèn) NameAge 字段以及 Introduce 方法,明明 Student 沒(méi)有定義這兩個(gè)字段和這個(gè)方法,為什么能訪問(wèn)和使用呢?這是因?yàn)?Student “繼承” 了 PersonPerson 結(jié)構(gòu)體的字段和方法,在 Student 結(jié)構(gòu)體里隱式實(shí)現(xiàn)。

接口類(lèi)型嵌入

type Coder interface {
    Code()
}

type Tester interface {
    Test()
}

type TesterCoder interface {
    Tester
    Coder
}
  • 定義 Coder 接口,接口有 Code 編碼方法。
  • 定義 Tester 接口,接口有 Test 測(cè)試方法。
  • 定義 TesterCoder 接口,內(nèi)嵌 CoderTester 接口類(lèi)型,通過(guò)組合,讓 TesterCoder 接口擁有 Code 編碼方法和 Test 測(cè)試方法。看到這里,有的小伙伴可能會(huì)想到開(kāi)發(fā)崗測(cè)試崗測(cè)試開(kāi)發(fā)崗
  • Go 標(biāo)準(zhǔn)庫(kù)中可以看到很多這種組合方式的應(yīng)用。

小結(jié)

本文介紹了 Go 語(yǔ)言中的 “繼承”,它是通過(guò)組合的思想去模擬實(shí)現(xiàn)面向?qū)ο笾械睦^承。然后介紹了什么是類(lèi)型嵌入以及類(lèi)型嵌入的兩種類(lèi)型,嵌入的類(lèi)型包含的字段和方法以隱式存在。

“繼承”的實(shí)現(xiàn),能夠提高代碼的復(fù)用性,代碼的維護(hù)性和擴(kuò)展性也得以提高。

原文鏈接:https://juejin.cn/post/7177405287446839354

欄目分類(lèi)
最近更新