golang面向對象特性

golang面向對象特性

來自專欄互聯網技術就業指南2 人贊了文章

文章作者:Hatlonely

作品來源:golang 面向對象特性 | hatlonely的小站

和其他高級語言一樣,golang 也支持面向對象編程,支持得比較簡單,有些特性並不支持,但是夠用了

介面

介面使用 interface 關鍵字聲明,任何實現介面定義方法的類都可以實例化該介面,介面和實現類之間沒有任何依賴,你可以實現一個新的類當做 Sayer 來使用,而不需要依賴 Sayer 介面,也可以為已有的類創建一個新的介面,而不需要修改任何已有的代碼,和其他靜態語言相比,這可以算是 golang 的特色了吧

type Sayer interface { Say(message string) SayHi()}

繼承

繼承使用組合的方式實現

type Animal struct { Name string}func (a *Animal) Say(message string) { fmt.Printf("Animal[%v] say: %v
", a.Name, message)}type Dog struct { Animal}

Dog 將繼承 Animal 的 Say 方法,以及其成員 Name

覆蓋

子類可以重新實現父類的方法

// override Animal.Sayfunc (d *Dog) Say(message string) { fmt.Printf("Dog[%v] say: %v
", d.Name, message)}

Dog.Say 將覆蓋 Animal.Say

多態

介面可以用任何實現該介面的指針來實例化

var sayer Sayersayer = &Dog{Animal{Name: "Yoda"}}sayer.Say("hello world")

但是不支持父類指針指向子類,下面這種寫法是不允許的

var animal *Animalanimal = &Dog{Animal{Name: "Yoda"}}

同樣子類繼承的父類的方法引用的父類的其他方法也沒有多態特性

func (a *Animal) Say(message string) { fmt.Printf("Animal[%v] say: %v
", a.Name, message)}func (a *Animal) SayHi() { a.Say("Hi")}func (d *Dog) Say(message string) { fmt.Printf("Dog[%v] say: %v
", d.Name, message)}func main() { var sayer Sayer sayer = &Dog{Animal{Name: "Yoda"}} sayer.Say("hello world") // Dog[Yoda] say: hello world sayer.SayHi() // Animal[Yoda] say: Hi}

上面這段代碼中,子類 Dog 沒有實現 SayHi 方法,調用的是從父類 Animal.SayHi,而 Animal.SayHi 調用的是 Animal.Say 而不是Dog.Say,這一點和其他面向對象語言有所區別,需要特別注意,但是可以用下面的方式來實現類似的功能,以提高代碼的復用性

func SayHi(s Sayer) { s.Say("Hi")}type Cat struct { Animal}func (c *Cat) Say(message string) { fmt.Printf("Cat[%v] say: %v
", c.Name, message)}func (c *Cat) SayHi() { SayHi(c)}func main() { var sayer Sayer sayer = &Cat{Animal{Name: "Jerry"}} sayer.Say("hello world") // Cat[Jerry] say: hello world sayer.SayHi() // Cat[Jerry] say: Hi}

參考鏈接

  • 完整代碼參考: github.com/hatlonely/he

添加客服微信:grey0805,共享更多精彩

推薦閱讀:

TAG:面向對象編程 | 編程語言 | Go語言 |