在物件導向思想中,實現物件關係需要使用“繼承”特性。例如,人類不能飛行,鳥類可以飛行。人類和鳥類都可以繼承自可行走類,但只有鳥類繼承自飛行類。
物件導向的設計原則中也建議物件最好不要使用多重繼承,有些物件導向語言從語言層面就禁止了多重繼承,如 C# 和 Java 語言。鳥類同時繼承自可行走類和飛行類,這顯然是存在問題的。在物件導向思想中要正確地實現物件的多重特性,只能使用一些精巧的設計來補救。
Go語言的結構體內嵌特性就是一種組合特性,使用組合特性可以快速構建物件的不同特性。
下面的程式碼使用Go語言的結構體內嵌實現物件特性組合,請參考下面的程式碼。
人和鳥的特性:
package main
import "fmt"
// 可飛行的
type Flying struct{}
func (f *Flying) Fly() {
fmt.Println("can fly")
}
// 可行走的
type Walkable struct{}
func (f *Walkable) Walk() {
fmt.Println("can calk")
}
// 人類
type Human struct {
Walkable // 人類能行走
}
// 鳥類
type Bird struct {
Walkable // 鳥類能行走
Flying // 鳥類能飛行
}
func main() {
// 範例化鳥類
b := new(Bird)
fmt.Println("Bird: ")
b.Fly()
b.Walk()
// 範例化人類
h := new(Human)
fmt.Println("Human: ")
h.Walk()
}
程式碼說明如下:
-
第 6 行,宣告可飛行結構(Flying)。
-
第 8 行,為可飛行結構新增飛行方法 Fly()。
-
第 13 行,宣告可行走結構(Walkable)。
-
第 15 行,為可行走結構新增行走方法 Walk()。
-
第 20 行,宣告人類結構。這個結構嵌入可行走結構(Walkable),讓人類具備“可行走”特性
-
第 25 行,宣告鳥類結構。這個結構嵌入可行走結構(Walkable)和可飛行結構(Flying),讓鳥類具備既可行走又可飛行的特性。
-
第 33 行,範例化鳥類結構。
-
第 35 和 36 行,呼叫鳥類可以使用的功能,如飛行和行走。
-
第 39 行,範例化人類結構。
-
第 41 行,呼叫人類能使用的功能,如行走。
執行程式碼,輸出如下:
Bird:
can fly
can calk
Human:
can calk
使用Go語言的內嵌結構體實現物件特性,可以自由地在物件中增、刪、改各種特性。Go語言會在編譯時檢查能否使用這些特性。