golang 物件導向特性

來源:互聯網
上載者:User

和其他進階語言一樣,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\n", 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\n", 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\n", a.Name, message)}func (a *Animal) SayHi() {    a.Say("Hi")}func (d *Dog) Say(message string) {    fmt.Printf("Dog[%v] say: %v\n", 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\n", 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}

參考連結

  • 完整代碼參考: https://github.com/hatlonely/hellogolang/blob/master/internal/buildin/object_oriented_test.go

轉載請註明出處
本文連結:http://www.hatlonely.com/2018/06/19/golang-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%89%B9%E6%80%A7/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.