[Goチュートリアルシリーズノート]マルチステート-GOのOOP
5795 ワード
Goにおける多態性はインタフェースの助けによって実現される.既に議論したように,インタフェースはGoで暗黙的に実現できる.タイプがインタフェースで宣言されたすべてのメソッドを定義している場合、タイプはインタフェースを実装します.インタフェースの助けの下でどのようにGoの中で多態性を実現するかを見てみましょう.
インタフェースのマルチステートの使用
インタフェースを定義するすべてのメソッドのタイプは、暗黙的実装インタフェースと呼ばれます.
インタフェースタイプの変数には、実装インタフェースの任意の値が含まれます.インタフェースのこのプロパティは、Goでマルチステートを実装するために使用されます.
組織の純収益を計算するプログラムの助けの下でGoの多態性を理解しましょう.簡単にするために、この想像の組織には2つのプロジェクトの収入があると仮定します.固定請求書、時間と材料.組織の純収益は、これらの項目の収益合計で計算されます.このチュートリアルを簡略化するために、通貨がドルであると仮定します.私たちはセントを処理しません.intが使用されます.(私はhttps://forum.golangbridge.or...を読んで、セントの処理方法を理解することをお勧めします.)
まずインタフェースIncomeを定義します.
type Income interface {
calculate() int
source() string
}
Incomeで定義されたインタフェースには、ソースからの収益を計算して返す2つのメソッド
calculate()
と、ソースの名前を返すsource()
が含まれています.次に、
FixedBilling
プロジェクトタイプの構造を定義します.type FixedBilling struct {
projectName string
biddedAmount int
}
この
FixedBilling
プロジェクトには2つのフィールドprojectNameがあり、プロジェクトの名前とbiddedAmount
がプロジェクトに割り当てられた金額を表します.この
TimeAndMaterial
構造は、時間および材料タイプの項目を表す.type TimeAndMaterial struct {
projectName string
noOfHours int
hourlyRate int
}
この
TimeAndMaterial
構造には、3つのフィールド名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
", income.source(), income.calculate())
netincome += income.calculate()
}
fmt.Printf("Net income of organisation = $%d", netincome)
}
この
calculateNetIncome
関数は[]Income
をパラメータのインタフェースとして受け入れます.スライスを反復し、各項目でメソッドcalculate()
を呼び出すことによって、総収益を計算します.また、source()
メソッドを呼び出して収益源を表示します.異なるIncome
およびcalculate()
メソッドは、特定のタイプのsource()
インタフェースに従って呼び出される.従って,calculateNetIncome
関数において多態性を実現した.