1. 程式人生 > 實用技巧 >golang:面向物件總結

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”結尾)。