回覆列表
  • 1 # Go語言中文網

    面向物件的設計思想,是根據現實世界進行抽象得出的一套理論。既然是現實世界的抽象,繼承的本質是有“父子”關係。比如,動物是父類,貓是子類。不能說有父類的屬性和方法就是繼承。

    Go 語言之所以擯棄繼承,主要考慮到,面向物件這麼多年的發展,繼承被濫用了。但一些繼承的特性有很需要,所以,提供了“嵌入”這種東西,方便“模擬”繼承,但它的本質是組合,不是繼承。

    我舉一個例子,證明 Go 中的嵌入是組合不是繼承。

    package mainimport ( "fmt")type Animal struct { Name string Age int}type Cat struct { *Animal Type string}func TestInherit(a *Animal) { fmt.Println(a.Name)}func main() { cat := &Cat{ Animal: &Animal{Name: "xiaohua", Age: 12}, Type: "波斯貓", } TestInherit(cat)}

    以上程式碼會編譯錯誤:

    cannot use cat (type *Cat) as type *Animal in argument to TestInherit

    但按照面向物件的理論:所有能用父類的地方,都可以使用子類。很明顯,Go 的嵌入不符合這個要求。

  • 中秋節和大豐收的關聯?
  • 自動擋機械擋和電子擋哪個好?