在 Go 語言中,函數可以作為接口值存儲,從而實現多態性:定義接口,規定一組方法簽名。建立實作介面的類型,並為其實作這些方法。定義一個函數,接受介面值作為輸入。函數中僅使用介面值的方法,而不考慮實際類型。使用不同類型的值呼叫函數,實現多態性。
在Go 語言中,函數可以作為介面值存儲,這使我們能夠實現多態性,即使Go 語言本身不是物件導向的。
介面定義了一組方法的簽名,實作介面的類型必須實作這些方法。例如,我們定義一個Shape
介面:
type Shape interface { Area() float64 }
#我們可以建立實作Shape
介面的類型,如下所示:
type Rectangle struct { width, height float64 } func (r Rectangle) Area() float64 { return r.width * r.height } type Circle struct { radius float64 } func (c Circle) Area() float64 { return math.Pi * c.radius * c.radius }
現在,我們建立了一個Shape
接口,我們可以使用函數作為其值。為此,我們定義一個 calculateArea
函數,它接受一個 Shape
介面值作為輸入。
func calculateArea(s Shape) float64 { return s.Area() }
現在,讓我們建立一個實例來示範多態性是如何實現的。
func main() { // 创建一个 Rectangle 和一个 Circle r := Rectangle{width: 2, height: 3} c := Circle{radius: 5} // 使用函数计算他们的面积 areaR := calculateArea(r) areaC := calculateArea(c) fmt.Println("Rectangle area:", areaR) fmt.Println("Circle area:", areaC) }
輸出:
Rectangle area: 6 Circle area: 78.53981633974483
在這個範例中,calculateArea
函數只使用傳入的Shape
介面的Area
方法,無論實際類型是Rectangle
還是Circle
。這就是多態性的體現。
以上是golang函數在物件導向程式設計中的多態性實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!