區塊鏈技術語言(二十四):Go語言面向物件:匿名組合
繼承也是面向物件的三大基本特性之一。
通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。通過繼承,不僅可以讓某個型別的物件擁有屬於自己的資料結構和操作,還會自動擁有父類的資料結構和操作。這使得現有的類在無需重新編寫原來類的情況下對這些功能進行了擴充套件,很好地解決了程式碼的重用問題。
繼承機制的魅力和強大在於它允許程式員利用已經存在的類,並且可以以某種方式擴充套件這個類,而且對其他繼承了這個父類屬性和方法的物件沒有影響。
但Go語言沒有繼承這個概念,它通過匿名組合間接實現了繼承的特性。
1
匿名組合實現的屬性繼承
1.1 匿名欄位
在結構體那一章節介紹過Go語言的匿名欄位:即只有型別、沒有欄位名的欄位。雖然匿名欄位沒有名稱,但本質上是以型別名為名稱的欄位。所有內建型別和自定義型別都可以作為匿名欄位。
1.2 匿名欄位構成的匿名組合
如果結構體中的匿名欄位是結構體型別,那麼這個結構體所擁有的全部欄位都被隱式地引入了當前定義的這個結構體。這種結構體內部巢狀結構體匿名欄位的組合被稱作匿名組合。而結構體匿名欄位中的成員可以通過外部結構體直接訪問。
1.3 同名欄位構成的匿名組合
外部結構體的成員變數名和嵌入的結構體匿名欄位中的成員變數名相同,則此外部結構體成員被稱作同名欄位。同名欄位可以通過外部結構體直接訪問,但是匿名欄位中與同名欄位同名的成員變數的訪問需要顯式呼叫,其他成員變數可以通過外部結構體直接訪問。
1.4 匿名組合和非匿名組合的區別
和匿名組合相比,非匿名組合有兩點不同:
第一,內部的嵌入欄位是有變數名的,呼叫該欄位的內部成員需要顯式呼叫;
第二,嵌入欄位所擁有的全部欄位並沒有被隱式地引入當前定義的這個結構體,也就是沒有實現繼承。
1.5 其他匿名欄位
匿名欄位不僅可以是結構體型別,還可以是其他任意的內建型別和自定義型別,甚至可以是結構體的指標型別。
1.5.1 非結構體型別
非結構體型別包括:所有的內建型別和自定義型別。
1.5.2 結構體指標型別
匿名欄位不僅可以是結構體型別,也可以是結構體指標型別。
2
匿名組合的方法繼承與重寫
2.1 方法的繼承
如果巢狀在結構體內部的匿名欄位已經實現了一個方法,那麼外部結構體就“繼承”了這個方法。外部結構體也可以實現其他方法。
2.2 方法的重寫
如果巢狀在結構體內部的是匿名欄位,內部結構體實現了方法。外部結構體對此方法進行了修改,這就叫做方法的重寫。可以通過外部結構體直接訪問重寫後的方法,但是匿名欄位的方法需要顯式呼叫。
ofollow,noindex"> 原文連結:區塊鏈技術語言(二十四):Go語言面向物件—匿名組合
參考資料
[1] 譚浩強.C++面向物件程式設計[M]. 清華大學出版社,2006
[2] 陳維興,陳昕.C++面向物件程式設計[M]. 人民郵電出版社,2010
本文完,獲取更多資訊,敬請關注區塊鏈工程師。
來源:鏈塊學院
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”