golang 物件導向特性

2021-08-20 20:21:28 字數 1560 閱讀 9586

和其他高階語言一樣,golang 也支援物件導向程式設計,支援得比較簡單,有些特性並不支援,但是夠用了

介面使用 inte***ce 關鍵字宣告,任何實現介面定義方法的類都可以例項化該介面,介面和實現類之間沒有任何依賴,你可以實現乙個新的類當做 sayer 來使用,而不需要依賴 sayer 介面,也可以為已有的類建立乙個新的介面,而不需要修改任何已有的**,和其他靜態語言相比,這可以算是 golang 的特色了吧

type sayer inte***ce
繼承使用組合的方式實現

type animal struct 

func (a *animal) say(message string)

type dog struct

dog 將繼承 animal 的 say 方法,以及其成員 name

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

// override animal.say

func (d *dog) say(message string)

dog.say 將覆蓋 animal.say

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

var sayer sayer

sayer = &dog}

sayer.say("hello world")

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

var animal *animal

animal = &dog}

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

func (a *animal) say(message string) 

func (a *animal) sayhi()

func (d *dog) say(message string)

func main() }

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) 

type cat struct

func (c *cat) say(message string)

func (c *cat) sayhi()

func main() }

sayer.say("hello world") // cat[jerry] say: hello world

sayer.sayhi() // cat[jerry] say: hi

}

golang 物件導向

method的語法如下 func r receivertype funcname parameters results 下面我們用最開始的例子用method來實現 package main import fmt math type rectangle struct type circle struc...

golang 物件導向

package main golang 物件導向 import fmt type相當於 c c 的 typedef拉 type myint int64 type person struct 繼承 匿名欄位person,相當於c c 的繼承拉,student就擁有了person所有的屬性拉,其實c c...

golang 物件導向

method的語法如下 func r receivertype funcname parameters results 下面我們用最開始的例子用method來實現 package main import fmt math type rectangle struct type circle struc...