本篇文章給大家分享的是有關如何使golang實現繼承,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
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 關鍵字表達的繼承特性,但是采用組合的方式也是可以實現繼承語義的
以上就是如何使golang實現繼承,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。