Go中如何繼承

[TOC]
在這里簡單分享一下在Go中如何實現繼承。

1. 簡單的組合

說到繼承我們都知道,在Go中沒有extends關鍵字,也就意味著Go并沒有原生級別的繼承支持。這也是為什么我在文章開頭用了偽繼承這個詞璧榄。本質上特漩,Go使用interface實現的功能叫組合,Go是使用組合來實現的繼承骨杂,說的更精確一點涂身,是使用組合來代替的繼承,舉個很簡單的例子搓蚪。

1.1 實現父類

我們用很容易理解的動物-貓來舉例子蛤售,廢話不多說,直接看代碼妒潭。

type Animal struct {
    Name string
}

func (a *Animal) Eat() {
    fmt.Printf("%v is eating", a.Name)
    fmt.Println()
}

type Cat struct {
    *Animal
}

cat := &Cat{
    Animal: &Animal{
        Name: "cat",
    },
}
cat.Eat() // cat is eating

1.2 代碼分析

首先悴能,我們實現了一個Animal的結構體,代表動物類雳灾。并聲明了Name字段漠酿,用于描述動物的名字。
然后谎亩,實現了一個以Animal為receiver的Eat方法炒嘲,來描述動物進食的行為。
最后匈庭,聲明了一個Cat結構體夫凸,組合了Cat字段。再實例化一個貓阱持,調用Eat方法夭拌,可以看到會正常的輸出。
可以看到衷咽,Cat結構體本身沒有Name字段鸽扁,也沒有去實現Eat方法。唯一有的就是組合了Animal父類兵罢,至此献烦,我們就證明了已經通過組合實現了繼承。

2. 優(yōu)雅的組合

上面的僅僅是為了給還沒有了解過Go組合的人看的卖词。作為一個簡單的例子來理解Go的組合繼承,這是完全沒有問題的 吏夯。但如果要運用在真正的開發(fā)中此蜈,那還是遠遠不夠的。

舉個例子噪生,我如果是這個抽象類的使用者裆赵,我拿到animal類不能一目了然的知道這個類干了什么,有哪些方法可以調用跺嗽。以及战授,沒有統(tǒng)一的初始化方式页藻,這意味著凡是涉及到初始化的地方都會有重復代碼。如果后期有初始化相關的修改植兰,那么只有一個一個挨著改份帐。所以接下來,我們對上述的代碼做一些優(yōu)化楣导。

2.1 抽象接口

接口用于描述某個類的行為废境。例如,我們即將要抽象的動物接口就會描述作為一個動物筒繁,具有哪些行為噩凹。常識告訴我們,動物可以進食(Eat)毡咏,可以發(fā)出聲音(bark)驮宴,可以移動(move)等等。這里有一個很有意思的類比呕缭。

// 模擬動物行為的接口
type IAnimal interface {
    Eat() // 描述吃的行為
}

// 動物 所有動物的父類
type Animal struct {
    Name string
}

// 動物去實現IAnimal中描述的吃的接口
func (a *Animal) Eat() {
    fmt.Printf("%v is eating\n", a.Name)
}

// 動物的構造函數
func newAnimal(name string) *Animal {
    return &Animal{
        Name: name,
    }
}

// 貓的結構體 組合了animal
type Cat struct {
    *Animal
}

// 實現貓的構造函數 初始化animal結構體
func newCat(name string) *Cat {
    return &Cat{
        Animal: newAnimal(name),
    }
}

cat := newCat("cat")
cat.Eat() // cat is eating

在Go中其實沒有關于構造函數的定義堵泽。例如我們在Java中可以使用構造函數來初始化變量,舉個很簡單的例子臊旭,Integer num = new Integer(1)落恼。而在Go中就需要使用者自己通過結構體的初始化來模擬構造函數的實現。

然后在這里我們實現子類Cat离熏,使用組合的方式代替繼承佳谦,來調用Animal中的方法。運行之后我們可以看到滋戳,Cat結構體中并沒有Name字段钻蔑,也沒有實現Eat方法,但是仍然可以正常運行奸鸯。這證明我們已經通過組合的方式了實現了繼承咪笑。

2.2 重寫方法

// 貓結構體IAnimal的Eat方法
func (cat *Cat) Eat() {
    fmt.Printf("children %v is eating\n", cat.Name)
}

cat.Eat()
// children cat is eating

可以看到,Cat結構體已經重新實現了Animal中的Eat方法娄涩,這樣就實現了重寫窗怒。

2.3 參數多態(tài)

什么意思呢?舉個例子蓄拣,我們要如何在Java中解決函數的參數多態(tài)問題扬虚?熟悉Java的可能會想到一種解決方案,那就是通配符球恤。用一句話概括辜昵,使用了通配符可以使該函數接收某個類的所有父類型或者某個類的所有子類型。但是我個人認為對于不熟悉Java的人來說咽斧,可讀性不是特別友好堪置。

而在Go中躬存,就十分方便了。

func check(animal IAnimal) {
    animal.Eat()
}

在這個函數中就可以處理所有組合了Animal的單位類型舀锨,對應到Java中就是上界通配符岭洲,即一個可以處理任何特定類型以及是該特定類型的派生類的通配符,再換句人話雁竞,啥動物都能處理钦椭。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碑诉,隨后出現的幾起案子彪腔,更是在濱河造成了極大的恐慌,老刑警劉巖进栽,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件德挣,死亡現場離奇詭異,居然都是意外死亡快毛,警方通過查閱死者的電腦和手機格嗅,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唠帝,“玉大人屯掖,你說我怎么就攤上這事〗笏ィ” “怎么了贴铜?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瀑晒。 經常有香客問我绍坝,道長,這世上最難降的妖魔是什么苔悦? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任轩褐,我火速辦了婚禮,結果婚禮上玖详,老公的妹妹穿的比我還像新娘把介。我一直安慰自己,他們只是感情好蟋座,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布劳澄。 她就那樣靜靜地躺著,像睡著了一般蜈七。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莫矗,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天飒硅,我揣著相機與錄音砂缩,去河邊找鬼。 笑死三娩,一個胖子當著我的面吹牛庵芭,可吹牛的內容都是我干的。 我是一名探鬼主播雀监,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼双吆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了会前?” 一聲冷哼從身側響起好乐,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓦宜,沒想到半個月后蔚万,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡临庇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年反璃,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假夺。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淮蜈,死狀恐怖,靈堂內的尸體忽然破棺而出已卷,到底是詐尸還是另有隱情梧田,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布悼尾,位于F島的核電站柿扣,受9級特大地震影響,放射性物質發(fā)生泄漏闺魏。R本人自食惡果不足惜未状,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望析桥。 院中可真熱鬧司草,春花似錦、人聲如沸泡仗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娩怎。三九已至搔课,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間截亦,已是汗流浹背爬泥。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工柬讨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袍啡。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓踩官,卻偏偏與公主長得像,于是被迫代替她去往敵國和親境输。 傳聞我的和親對象是個殘疾皇子蔗牡,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容