golang 物件導向特性
和其他高階語言一樣,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
}
參考連結
- 完整程式碼參考: <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/>
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- golang物件導向分析Golang物件
- Golang 中的物件導向Golang物件
- Golang物件導向_繼承Golang物件繼承
- 物件導向有哪些特性物件
- Golang 物件導向深入理解Golang物件
- Golang 基礎之物件導向Golang物件
- Java物件導向三大特性Java物件
- 08 ### 物件導向三大特性物件
- [譯] part 26: golang 的物件導向Golang物件
- 「Golang成長之路」物件導向篇Golang物件
- 物件導向 -- 三大特性之多型物件多型
- Python物件導向三大特性Python物件
- C++物件導向三大特性C++物件
- 物件導向-物件導向思想物件
- 2.1.1 Python物件導向三大特性Python物件
- 物件導向 -- 三大特性之繼承物件繼承
- 物件導向 -- 三大特性之封裝物件封裝
- java基礎 - 物件導向三大特性Java物件
- 第十八章 物件導向的特性物件
- [.net 物件導向程式設計基礎] (13) 物件導向三大特性——多型物件程式設計多型
- [.net 物件導向程式設計基礎] (12) 物件導向三大特性——繼承物件程式設計繼承
- [.net 物件導向程式設計基礎] (11) 物件導向三大特性——封裝物件程式設計封裝
- 【跟著我們學Golang】之物件導向Golang物件
- [譯] part 28: golang 的物件導向 -- 多型Golang物件多型
- 11-物件導向-2-三大特性物件
- 設計模式(二):物件導向及其特性分析設計模式物件
- swift物件導向特性——類和結構體Swift物件結構體
- C#物件導向三大特性總結C#物件
- Java物件導向04——三大特性之多型Java物件多型
- 深入理解物件導向,物件導向3個特性7個原則6種關係物件
- 3. Struct 與 物件導向 |《 刻意學習 Golang 》Struct物件Golang
- 程式導向與物件導向物件
- 物件導向與程式導向物件
- “程序導向”和“物件導向”物件
- 【Java基礎知識】物件導向有哪些特性Java物件
- Java中物件導向三大特性之繼承Java物件繼承
- PHP物件導向深入研究之【高階特性】PHP物件
- Java物件導向03——三大特性之繼承Java物件繼承