[Go 教程系列筆記]多態-Go中的OOP

Go 中的多態性是在接口的幫助下實現的。正如我們已經討論過的,接口可以在Go 中隱式實現。如果類型定義了接口中聲明的所有方法,則類型實現接口。讓我們看看在接口的幫助下如何在Go中實現多態性。

使用接口的多態性

任何定義了接口所有方法的類型都被稱爲隱式實現該接口。

接口類型的變量可以包含實現接口的任何值。接口的這個屬性用於在Go中實現多態。

讓我們在計算組織淨收入的程序的幫助下理解Go中的多態性。爲簡單起見,我們假設這個想象中的組織有兩種項目的收入。固定賬單,時間和材料。該組織的淨收入按這些項目的收入總和計算。爲了簡化本教程,我們假設貨幣是美元,我們不會處理美分。它將使用int。(我建議閱讀 https://forum.golangbridge.or... 以瞭解如何處理美分。)

<!-- more -->

我們首先定義一個接口Income。

type Income interface {  
    calculate() int
    source() string
}

Income上面定義的接口包含兩個方法 calculate() 計算並返回來自源的收入,和source() 返回源的名稱。

接下來讓我們爲FixedBilling項目類型定義一個結構。

type FixedBilling struct {  
    projectName string
    biddedAmount int
}

FixedBilling項目有兩個字段 projectName,表示項目的名稱,以及biddedAmount組織爲項目出價的金額。

TimeAndMaterial結構將代表時間和材料類型的項目。

type TimeAndMaterial struct {  
    projectName string
    noOfHours  int
    hourlyRate int
}

TimeAndMaterial結構有三個字段名稱projectNamenoOfHourshourlyRate

下一步是定義這些結構類型的方法,這些方法計算並返回實際收入和收入來源。

func (fb FixedBilling) calculate() int {  
    return fb.biddedAmount
}

func (fb FixedBilling) source() string {  
    return fb.projectName
}

func (tm TimeAndMaterial) calculate() int {  
    return tm.noOfHours * tm.hourlyRate
}

func (tm TimeAndMaterial) source() string {  
    return tm.projectName
}

FixedBilling項目而言,收入只是項目的投標金額。因此我們從FixedBilling類型的calculate()方法返回它。

TimeAndMaterial項目的例子裏,產品的收入 noOfHourshourlyRate,從具有TimeAndMaterial 接收器類型的方法calculate() 返回此值。

我們將該項目的名稱作爲該source()方法的收入來源返回。

由於兩者FixedBillingTimeAndMaterial結構都提供了接口calculate()和source()方法的定義Income,因此兩個結構都實現了Income接口。

讓我們聲明calculateNetIncome將計算和打印總收入的函數。

 func calculateNetIncome(ic []Income) {  
    var netincome int = 0
    for _, income := range ic {
        fmt.Printf("Income From %s = $%d\n", income.source(), income.calculate())
        netincome += income.calculate()
    }
    fmt.Printf("Net income of organisation = $%d", netincome)
}

calculateNetIncome 函數接受 []Income 作爲參數的接口。它通過迭代切片並在每個項目上調用方法 calculate() 來計算總收入。它還通過調用source()方法顯示收入來源。根據具體類型的Income接口,不同calculate()source()方法將被調用。因此我們在calculateNetIncome函數中實現了多態性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章