golang:面向物件總結
所謂的面向物件其實就是找一個專門做這個事的人來做,不用關心具體怎麼實現的。所以說,面向過程強調的是過程,步驟。而面向物件強調的是物件,也就是幹事的人。
Go語言:面嚮物件語言特性
-
方法
-
嵌入
-
介面
-
沒有類
-
支援型別。 特別是, 它支援structs。 Structs是使用者定義的型別。 Struct型別(含方法)提供類似於其它語言中類的服務。
Structs
一個struct定義一個狀態。 這裡有一個strudent struct。 它有一個Name屬性和一個布林型別的標誌Real,告訴我們它是一個真實的strudent還是一個虛構的strudent。 Structs只儲存狀態,不儲存行為。
type Creature struct {
Name string
Real bool
}
為結構體新增方法
方法是對特定型別進行操作的函式。 它們有一個接收器條款,命令它們對什麼樣的型別可進行操作。 這裡是一個Hello()方法,它可對student結構進行操作,並打印出它們的狀態:
func (s Student) Hello() {
fmt.Printf("Name: '%s', Real: %t\n", s.Name, s.Real)
}
func (s Student) func_name(){}
這是一個不太常見的語法,但是它非常的具體和清晰,不像this的隱喻性。
一般在定義方法時,需要定義為結構體的指標,值型別的在修改結構體屬性時,無法修改其內容
package main import "fmt" type human struct { Name string Real bool } type Student struct { human Id int } func (h human) Hello() { fmt.Printf("姓名:%s\n", h.Name) } func (s Student) PrintId() { fmt.Printf("學號:%d\n", s.Id) } func (s Student) EditId(id int) { s.Id = id } func main() { zhangsan := Student{ human: human{"zhangsan", true}, Id: 10, } zhangsan.Hello() zhangsan.EditId(101) zhangsan.PrintId() }
嵌入(繼承)
可以將匿名的型別嵌入進struct。 如果你嵌入一個匿名的struct那麼被嵌入的struct對接受嵌入的struct直接提供它自己的狀態(和方法)。 比如,strudent
有一個匿名子的被嵌入的 human
struct,這意味著一個 student
就是一個 hunman
。
package main
import "fmt"
type human struct {
Name string
Real bool
}
type Student struct {
human
Id int
}
func (h *human) Hello() {
fmt.Printf("姓名:%s", h.Name)
}
func main() {
zhangsan := &Student{
human: human{"zhangsan", true},
Id: 10,
}
zhangsan.Hello()
}
重寫
就是子類(結構體)中的方法,將父類中的相同名稱的方法的功能重新給改寫了
注意:在呼叫時,預設呼叫的是子類中的方法
方法值和表示式值
方法表示式,即方法物件賦值給變數,方法表示式有兩種使用方式:
- 隱式呼叫:方法值,呼叫函式時,無需再傳遞接收者,隱藏了接收者
- 顯式呼叫:方法表示式,顯示的把接收者*Student傳遞過去
例項:
package main
import "fmt"
type human struct {
Name string
Real bool
}
type Student struct {
human
Id int
}
func (h *human) Hello() {
fmt.Printf("姓名:%s\n", h.Name)
}
func (s Student) PrintId() {
fmt.Printf("學號:%d\n", s.Id)
}
func (s Student) EditId(id int) {
s.Id = id
}
func main() {
zhangsan := Student{
human: human{"zhangsan", true},
Id: 10,
}
// 常規呼叫
zhangsan.Hello()
// 方法值 無需傳遞接收者
hello := zhangsan.Hello
hello()
// 方法表示式,呼叫函式式,傳遞接收者
hello1 := (*Student).Hello // 括號是因為 . 的優先順序要高於取指符,需要做特殊處理
hello1(&zhangsan)
}
Go語言:面向物件的設計
介面
介面是Go語言對面向物件支援的標誌。 介面是宣告方法集的型別。 與其它語言中的介面類似,它們不包含方法的實現。
實現所有介面方法的物件自動地實現介面。 它沒有繼承或子類或“implements”關鍵字。 在下面的程式碼中,Foo型別實現了Fooer介面(按照慣例,Go介面名稱以“er”結尾)。