golang 物件導向特性

hatlonely發表於2018-06-19

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

Dog.Say 將覆蓋 Animal.Say

多型

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

var sayer Sayer

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

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

var animal *Animal
animal = &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
}

參考連結

> 轉載請註明出處 > 本文連結:<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/>

更多原創文章乾貨分享,請關注公眾號
  • golang 物件導向特性
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章