Go語(yǔ)言使用組合的思想實(shí)現(xiàn)繼承
前言
Go語(yǔ)言的設(shè)計(jì)之初,就不打算支持面向?qū)ο蟮木幊烫匦?,因?Go不支持面向?qū)ο蟮娜筇匦灾?mdash;—繼承。但是Go可以通過(guò)組合的思想去實(shí)現(xiàn) “繼承”。- 繼承是面向?qū)ο蟮娜筇匦灾?,繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。
Go語(yǔ)言里的“繼承”體現(xiàn)如一個(gè)結(jié)構(gòu)體擁有另一個(gè)結(jié)構(gòu)體的的所有字段和方法,并在此基礎(chǔ)上,定義新的字段和方法。
類型嵌入
組合的思想,在 Go 語(yǔ)言里的體現(xiàn)就是類型嵌入。類型嵌入,指的是一個(gè)類型的定義里嵌入了其他類型。類型嵌入包含兩種,一種是結(jié)構(gòu)體類型嵌入,另一種是接口類型嵌入。
結(jié)構(gòu)體類型嵌入
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 類型的 Introduce 方法
student.Introduce()
// 執(zhí)行自身的 GoToTheClass 方法
student.GoToTheClass()
}執(zhí)行結(jié)果:
大家好,我叫小明,我今年18歲了。
去上課...
- 定義
Person結(jié)構(gòu)體,包含Name和Age字段以及Introduce方法。 - 定義
Student結(jié)構(gòu)體,定義School字段,GoToTheClass 方法,嵌入Person類型,直接以結(jié)構(gòu)體類型作為結(jié)構(gòu)體的字段,稱為 結(jié)構(gòu)體的類型嵌入,此字段也被視為 字段嵌入。 - 創(chuàng)建
Student變量student,通過(guò)student訪問(wèn)Name和Age字段以及Introduce方法,明明Student沒(méi)有定義這兩個(gè)字段和這個(gè)方法,為什么能訪問(wèn)和使用呢?這是因?yàn)?Student“繼承” 了Person,Person結(jié)構(gòu)體的字段和方法,在Student結(jié)構(gòu)體里隱式實(shí)現(xiàn)。
接口類型嵌入
type Coder interface {
Code()
}
type Tester interface {
Test()
}
type TesterCoder interface {
Tester
Coder
}- 定義
Coder接口,接口有Code編碼方法。 - 定義
Tester接口,接口有Test測(cè)試方法。 - 定義
TesterCoder接口,內(nèi)嵌Coder和Tester接口類型,通過(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ū)ο笾械睦^承。然后介紹了什么是類型嵌入以及類型嵌入的兩種類型,嵌入的類型包含的字段和方法以隱式存在。
“繼承”的實(shí)現(xiàn),能夠提高代碼的復(fù)用性,代碼的維護(hù)性和擴(kuò)展性也得以提高。
到此這篇關(guān)于Go語(yǔ)言使用組合的思想實(shí)現(xiàn)繼承的文章就介紹到這了,更多相關(guān)Go語(yǔ)言繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手教你vscode配置golang開(kāi)發(fā)環(huán)境的步驟
這篇文章主要介紹了手把手教你vscode配置golang開(kāi)發(fā)環(huán)境的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Go項(xiàng)目在linux服務(wù)器的部署詳細(xì)步驟
在今天的軟件開(kāi)發(fā)中,使用Linux作為操作系統(tǒng)的比例越來(lái)越高,而Golang語(yǔ)言則因?yàn)槠涓咝А⒑?jiǎn)潔和并發(fā)性能等特點(diǎn),也被越來(lái)越多的開(kāi)發(fā)者所青睞,這篇文章主要給大家介紹了關(guān)于Go項(xiàng)目在linux服務(wù)器的部署詳細(xì)步驟,需要的朋友可以參考下2023-09-09
使用Go語(yǔ)言解決Scan空格結(jié)束輸入問(wèn)題
這篇文章主要為大家介紹了使用Go語(yǔ)言來(lái)解決Scan空格結(jié)束輸入問(wèn)題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
使用Gorm操作Oracle數(shù)據(jù)庫(kù)踩坑記錄
gorm是目前用得最多的go語(yǔ)言orm庫(kù),本文主要介紹了使用Gorm操作Oracle數(shù)據(jù)庫(kù)踩坑記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

