Go語言結構體內嵌模擬類的繼承

2020-07-16 10:05:18
在物件導向思想中,實現物件關係需要使用“繼承”特性。例如,人類不能飛行,鳥類可以飛行。人類和鳥類都可以繼承自可行走類,但只有鳥類繼承自飛行類。

物件導向的設計原則中也建議物件最好不要使用多重繼承,有些物件導向語言從語言層面就禁止了多重繼承,如 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語言會在編譯時檢查能否使用這些特性。