和其他高階語言一樣,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
改寫
子類可以重新實現父類的方法
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")
sayer.SayHi() }
上面這段程式碼中,子類 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")
sayer.SayHi() }
參考連結
長按二維碼向我轉賬
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。
微信掃一掃
使用小程式