[Golang] 談Go中的繼承
阿新 • • 發佈:2018-11-22
繼承,這個概念來自於OOP思想。
所謂繼承,是指可以讓某個型別的物件獲得另一個型別的物件的屬性的方法。它支援按級分類的概念。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
繼承的關鍵詞:“獲得”,“程式碼複用”。
先來看看典型的OOP語言Python對於繼承的實現:
class person: def say(self): print("person") class lawyer(person): pass p = person() l = lawyer() p.say() l.say()
顯而易見,lawyer這個類在“繼承”了person類之後,什麼都不用幹就自動擁有了say方法。完美體現了“獲得”,“程式碼複用”。
那麼Go如何實現繼承?看程式碼:
type person struct { Name string } func (this person) say(){ fmt.Printf("i am %s\n", this.Name) } //“繼承”person type teacher struct { person //這個叫匿名欄位,其實就是個名字,不用在意 } //我不用又去寫一個say方法 func main (){ p := person{"trump"} p.say() t := teacher{person:person{"trump's teacher"}} t.say() }
程式碼是很簡單的就不解釋了,到這裡還沒結束。
為什麼有這篇文章?因為有人說用go中的介面來實現"繼承",是,在interface中也能使用匿名欄位,但是這就叫實現了“繼承”嗎???來看看他們是怎麼寫的程式碼:
//先定義一個共用介面,內含一些共用方法 type person_api interface { say() } //在另一個介面中“繼承”上一個介面 type person_2api interface { person_api run() } type lawyer struct { Name string } func (this lawyer) say(){ fmt.Printf("i am lawyer %s\n", this.Name) } type teacher struct { Name string } //我仍然要為teacher寫一個say方法才能擁有這個方法 func (this teacher) say(){ fmt.Printf("i am teacher %s\n", this.Name) } func (this teacher) run(){ fmt.Printf("teacher %s is running\n", this.Name) } func main (){ //建立一個介面物件,實現同一個物件的多種形態 var a1 person_api = lawyer{"sccot"} a1.say() var a2 person_2api = teacher{"wiliam"} a2.say() a2.run() }
這個只是“介面繼承”,僅僅是方便interface建立時的字面程式碼複用,然而在真正使用其方法時,要是不為teacher實現say方法,teacher根本不會擁有這個方法,也就是說僅僅在定義interface時“繼承”上一個介面是沒有luan用的,沒有辦法通過“介面繼承”的方式真正獲得另一個結構體擁有的方法。所謂“介面繼承”,其實與OOP思想提到的“繼承”沒有一絲關係。
本文作為個人學習的歸納總結,不能保證毫無瑕疵。如果您對我的文章有任何異議,請您留言。