- Go 教程系列筆記 Interface 第一部分
- Go 教程系列筆記 Interface 第二部分
- Go 教程系列筆記 併發介紹
- Go 教程系列筆記 goroutine(協程)
- Go 教程系列筆記 Channel 通道
- Go 教程系列筆記 緩衝通道和工作池
- Go 教程系列筆記 Select
- Go 教程系列筆記 Mutex(互斥鎖)
- Go 教程系列筆記 結構而不是類-Go中的OOP
- Go 教程系列筆記 組合而不是繼承-Go 中的 OOP
- 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
結構有三個字段名稱projectName
, noOfHours
和hourlyRate
。
下一步是定義這些結構類型的方法,這些方法計算並返回實際收入和收入來源。
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
項目的例子裏,產品的收入 noOfHours
和hourlyRate
,從具有TimeAndMaterial
接收器類型的方法calculate()
返回此值。
我們將該項目的名稱作爲該source()
方法的收入來源返回。
由於兩者FixedBilling
和TimeAndMaterial
結構都提供了接口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
函數中實現了多態性。