golang中介面的物件導向(二) 繼承

2021-10-06 15:46:21 字數 3400 閱讀 6988

在上一節 golang中介面的物件導向(一)–多型特徵中,我們學習了galang中的多型,

那麼這一節中,我們來學習繼承。

一般我們可以使用匿名字段嵌入結構體中來實現繼承;

type geometry inte***ce

type rect struct

或者匿名指標(介面型別是一種抽象型別,不能被例項化,所以 *geometry 型別是不存在的)

type geometry inte***ce

type rect struct

type circle struct

不論嵌入 rect 還是 rect 都是一樣的,因為rect是可以被例項化的,所以rect是存在的,

在繼承中,使用rect 還是 *rect 都是一樣的。

type geometry inte***ce

type rect struct

func

(r rect)

sayhi()

func

(r rect)

area()

float32

func

(r rect)

perim()

float32

type circle struct

func

show

(name string

, param inte***ce)}

func

main()

show

("rect"

, rec)

cir := circle

show

("circle"

, cir)

}

輸出:

i am a rect

[r]area of rect is 2

[r]perim of rect is 6

i am a rect

[c]area of circle is 0

[c]perim of circle is 0

circle 繼承了 rect 型別的屬性以及方法,因為circle型別長寬屬性均為0,所以area 、perim 計算結果都是0

如果我們在rect型別對sayhi方法重寫之前,加上下面這段**,大家考慮一下會出現什麼結果?

func

(r geometry)

sayhi()

編譯器會報invalid receiver type geometry (geometry is an inte***ce type)這樣的錯誤,

說明inte***ce 型別不能作為方法的接收者,此刻它內部的方法是並未實現的,

從上面的例子,我們可以看到rect型別繼承了geometry 型別的sayhi方法,並在之後重寫了該方法,並且rect還增加了兩個新的方法area以及perim。

而circle型別則繼承了rect型別的所有屬性以及方法(僅僅作為乙個例子,其實circle是不可能存在長、寬屬性的)。

我們來修改一下上面的**,show函式main函式保持不變,

type geometry inte***ce

type rect struct

func

(r rect)

sayhi()

func

(r rect)

area()

float32

func

(r rect)

perim()

float32

type circle struct

func

(c circle)

area()

float32

func

(c circle)

perim()

float32

注意:上述**中circle 並沒有重寫sayhi方法。

輸出如下:

i am a rect

[r]area of rect is 2

[r]perim of rect is 6

i am a rect

[c]area of circle is 3.1415927 // 重寫了 area方法,計算結果改變

[c]perim of circle is 6.2831855 // 重寫了 perim方法,計算結果改變

我們修改**,show函式main函式保持不變,為circle 增加對sayhi方法的重寫,

type circle struct

func

(r circle)

sayhi()

func

(c circle)

area()

float32

func

(c circle)

perim()

float32

輸出:

i am a rect

[r]area of rect is 2

[r]perim of rect is 6

i am a circle // 重寫了 sayhi方法,列印發生改變

[c]area of circle is 3.1415927

[c]perim of circle is 6.2831855

型別的變換

我們再一次修改**,只修改main函式,其它**不變,

func

main()

輸出:

ige addr is 0xc000088240

irec addr is 0xc0000a20b0

icir addr is 0xc0000a20c0

ige addr is 0xc000088240

i am a rect

[r]area of rect is 2

[r]perim of rect is 6

ige addr is c000088240

i am a circle

[c]area of circle is 3.1415927

[c]perim of circle is 6.2831855

從上面**可以看出,對ige = icir 賦值的操作,是乙個值傳遞。

我們可以看到從乙個超集(rect型別)賦值到 子集(geometry 型別),並沒有發生記憶體溢位,

大家可以思考一下,這是為什麼?

物件導向 介面的特點

介面的特點 inte ce 英特活死 a 介面用關鍵字inte ce表示 格式 inte ce 介面名 b 類實現介面用implements 英潑拉們次 class 類名 implements 介面名 c 介面不能被例項化 介面如何例項化呢?按照多型方式來例項化。d 介面的子類 a 可以是抽象類。但...

物件導向中的類和介面的理解

物件導向是一種 組織的方式,更是一種處理問題的思維,不同層次的理解,不同的感悟!郭德綱曾曰 不是我有多麼優秀,同行們的襯托 同樣的道理,物件導向也是在面向過程的模式襯托下有其獨特的地方 下面就從對比的角度來分析下類和介面的本質意義。在真實的業務開發中,先是根據業務抽象出乙個個類。如果對這些類沒有進行...

Golang學習筆記 物件導向介面封裝

package utils import fmt 定義結構體 type familyaccount struct 編寫要給工廠模式的構造方法 func newfamilyaccount familyaccount 主體業務邏輯 func this familyaccount initmainpage...