golang 面向物件(一)繼承
阿新 • • 發佈:2018-12-18
golang並非典型的面嚮物件語言,面向物件的特性不如java,c++那麼明顯。但是作為程式語言界最年輕的語言之一,還有一個牛逼的爹(他爹Google,,對,就是那個動不動搞個大新聞的Google),典型的富二代,golang對面向物件的支援也非常的好用,這篇文章,總結一些golang對面向物件的支援之-繼承,
一,繼承 ,讓我們來模擬下面這個場景:
老爸有一輛車(屬性),並且有開車技能(函式)。
他生的兒子,自動繼承老爸的財產車和技能開車。
不僅如此,時代在發展,兒子不僅有車,還有老爸沒有的私人飛機和開飛機的技能。
package main import "fmt" type Father struct { name string age string Car struct { speed string // 車速 brand string // 商標 } } func (f *Father) Driver() { fmt.Printf("I am a driver. I can drive car\n") } type Son struct { Father // 兒子,只需要在此處申明一個匿名father,就自動繼承了老爸的一切 Plane struct{ //兒子除了就開車,還會開私人飛機 price string //價格 } } func (s *Son)Fly() { fmt.Println("I have another personal aircraft. I can fly!") } func main() { son := &Son{} // 注意,此處,如果我只是申明瞭一個變數var son *Son,下面的函式執行也是沒有任何問題的,是不是很奇怪,一個空的結構體指標,下面的方法執行也不會報錯。至於為什麼,請看下一篇文章 son.Driver() //這兒子,一出生就有了車,還會開 son.Fly() /* *******running result******************** I am a driver. I can drive car I have another personal aircraft. I can fly! */ }
是不是很簡單。
二,有了遺傳(繼承),自然少不了變異(函式,屬性重寫override)
假設上面的兒子(90後,有個性),開車,不想沿用老爸(70後)開車,老爸開的是解放牌手動駕駛,兒子買了輛特斯拉,谷歌自動駕駛的,看我們如何模擬這一場景
package main import ( "fmt" ) type Father struct { name string age string Car struct { speed string // 車速 brand string // 商標 } } func (f *Father) Driver() { fmt.Printf("I am a driver. I can drive car\n") } type Son struct { Father // 兒子,只需要在此處申明一個匿名father,就自動繼承了老爸的一切 name string Plane struct{ //兒子除了就開車,還會開私人飛機 price string //價格 } } func (s *Son) Driver() { fmt.Println(s.name+" car. Google automatic driving") } func (s *Son)Fly() { fmt.Println("I have another personal aircraft. I can fly!") } func main() { son := Son{name:"Tesla"} son.Driver() // 兒子可以開自己的特斯拉 son.Father.Driver() // 也可以這樣呼叫,開老爸的解放牌 son.Fly() /* *******running result******************** Tesla car. Google automatic driving I am a driver. I can drive car I have another personal aircraft. I can fly! */ }
兒子重寫(override)了老爸的name欄位和Driver函式,並在預設呼叫son.Driver()中表現出自己獨有的特性。
完