golang實作繼承的方法:Go採用組合的方式來表達繼承的語義,程式碼為【type Cat struct {p *Pet}func (c *Cat) Catch(){fmt.Println("** ***")}】。
golang實作繼承的方法:
用封裝的話題上來,轉換成程式語言就是A把貓封裝成寵物了,B把狗封裝成寵物了,而C需要寵物時,貓和狗都是寵物,最終結果要么是程序依舊正常運行,要么是程序意外掛掉了,因為很可能某一種寵物可能不符合特定需求.
這種重複定義問題歸咎於封裝的標準不同,貓和狗兩者的封裝過程是獨立進行的,並沒有在一起商量著看看能不能繼續抽象出通用模型,混亂的封裝導致了貓是寵物,狗也是寵物.
這種多種相關概念的封裝很容易出現此類問題,所以適當進行統一分析繼續抽像出更高層次的封裝概念特別重要,基於此,原來的封裝就能從這種通用概念中解放出來,僅僅保留自己的特色就好,大大簡化了模型的語義.
普通封裝的概念和更高層次的抽象封裝概念的關係就是面向對像中的繼承,即貓繼承於寵物,表示貓不但擁有寵物的特點還有貓自己的亮點.
對於狗也是一樣,狗是寵物,狗也是狗自己本身,體現了自己的特點.
Go
語言和其他主流的面向對象語言有所不同,Go 並不支持繼承特性,因而也沒有單繼承,多繼承,重寫方法等複雜概念.
那Go是如何描述這種普通封裝和抽象封裝之間的關係呢?
肯定不是把貓定義成寵物,狗也定義成寵物那種方式!
Go 實現繼承的語義不是透過extends 關鍵字而是透過結構體組合的方式,請看相關代碼.
寵物就應該能文能武,這裡不關心結構體的字段,因而並沒有定義相關字段.
type Pet struct { } func (p *Pet) Skill() { fmt.Println("能文能武的宠物") }
貓是能夠抓老鼠的寵物,Go採用組合的方式表達繼承的語義.
type Cat struct { p *Pet } func (c *Cat) Catch() { fmt.Println("老鼠天敌喵喵喵") }
狗是自帶導航功能的寵物,看我導盲犬的超能力!
type Dog struct { p *Pet } func (d *Dog) Navigate() { fmt.Println("自带导航汪汪汪") }
接下來,C開始檢驗貓和狗作為寵物是否具備能文能武的基本要求,與此同時有沒有自身的特色?
func TestExtendInstance(t *testing.T) { p := new(Pet) d := new(Dog) d.p = p // 自带导航汪汪汪 d.Navigate() // 能文能武的宠物 d.p.Skill() fmt.Println() c := new(Cat) c.p = p // 老鼠天敌喵喵喵 c.Catch() // 能文能武的宠物 c.p.Skill() }
上述結果證明,Go 語言雖然不支援extends 關鍵字表達的繼承特性,但是採用組合的方式也是可以實現繼承語義的
#相關學習推薦: Go語言教學
以上是golang如何實作繼承?的詳細內容。更多資訊請關注PHP中文網其他相關文章!