1. 程式人生 > >[Golang] 談Go中的繼承

[Golang] 談Go中的繼承

 

繼承,這個概念來自於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思想提到的“繼承”沒有一絲關係。

本文作為個人學習的歸納總結,不能保證毫無瑕疵。如果您對我的文章有任何異議,請您留言。