Go語言的struct中無命名而只有型態的屬性稱為embedded field。
例如下面定義一個Employee
struct,其兩個屬性只有型態但沒名稱,所以都是embedded field。Embedded fields的型態名稱即為存取名稱。
package main
import (
"fmt"
"strconv"
)
type Employee struct {
int
string
}
func main() {
employee := Employee{1, "John"}
fmt.Println(employee) // {1 John}
fmt.Println(employee.string) // John
}
Embedded field的屬性(field)或方法(method)又稱為promoted fields或promoted methods。因為embedded field的屬性或方法能直接被所屬的struct引用。
例如下面Employee
為Manager
的embedded field,則Employee
的屬性及方法都能被Manager
直接引用,看起來像是被往上晉升了(promoted),但promoted fields/methods實際上仍屬於原本的embedded field type。
package main
import (
"fmt"
)
type Employee struct {
Id int
Name string
Age int
}
func (e Employee) ReportAge() {
fmt.Printf("%s is %d years old.\n", e.Name, e.Age)
}
type Manager struct {
Employee
Title string
}
func main() {
manager := Manager{Employee{1, "John", 33}, "CTO"}
fmt.Println(manager.Age) // 33
manager.Age = 44
fmt.Println(manager.Age) // 44
manager.ReportAge() // John is 44 years old.
}
Go並沒有物件導向程式如Java的繼承設計,而是透過嵌入欄位來達到類似效果。所以上面的Manager
就像是"繼承"了Employee
的特性。
沒有留言:
張貼留言